XYZと申します。よろしくお願いいたします。
現在、あるテキストファイルの一部分をコピーする、ということをしたいの
ですが、コピーする最後の位置にファイルポインタを移動させ、ftell()にて
その位置を取得して、得られた値の数だけ読み込み、そのデータを新しいファイル
として作成するという流れで処理していますが、どうしても目的の位置以上の
データまでになってしまいます。
図で表すと、
あいうえお
かきくけこ
さしすせそ
-----------←この位置までコピーしたいのに
たちつてと
なにぬねの
はひふへほ
-----------←ここまでになってしまう
まみむめも
やゆよ
わをん
このようになってしまいます。
プログラムはおおよそ下記のようにしています。
FILE* readfile
FILE* newfile
char* tmp[50];
char* writedata;
int cpypos;
readfile = fopen(~/読み込むファイル.txt,rt);
//目的の位置を検索
while(1){
fscanf(readfile, %s, tmp);
if(strcmp(tmp, さしすせそ)==0)
break;
}
//現在のファイル位置を取得
cpypos = ftell(readfile);
//必要なメモリを確保
writedata = (char*)malloc(sizeof(char)*cpypos);
//必要な部分だけ読み込み
fseek(readfile, 0, SEEK_SET);
fread(writedata, 1, cpypos, readfile);
//読み込んだデータを新しいファイルへ書き込み
newfile = fopen(~/新しいファイル.txt, wt);
fwrite(writedata, 1, cpypos, newfile);
fclose(readfile);
fclose(newflile);
このような感じで処理しております。
実際のテキストファイルは、200KB位あり、タブ(\t)が多数書き込まれて
おります。
自分としては、普通にftell()で位置を取得して、読みこんで、そのデータを
書き込めば終了、と安易に考えておりましたがなぜこのような処理で上手く
いかないのでしょうか。
どうかよろしくお願いいたします。
ftell() が返却する値は必ずしもファイルから読み取ったバイト数ではないからです。
ヘルプにも書いてあります。
ファイルの先頭から目標位置まで、ということなら、読み取り・チェックしながら
同時に書き出せばよいでしょう。
躓いたらHELP(MSDN)を読みましょう。
HELPは宝の山といった人がいたとかいないとか。
掘り出すのにコツが必要だったりしますが、
これは回数こなして身につけるしかないです。
せめて、関数のHELPは最低でもチェック!
うまくたどると関連情報が芋づる式に出てくるのもMSDNの特徴かと。
検索をうまく利用して自己解決の手段としましょう。
>tetrapod様 PATIO様
ご助言いただきありがとうございます。
もう少し自分で確認してからにするように気をつけたいと思います。
どうもありがとうございました。