ftell()で取得する位置について – プログラミング – Home

ftell()で取得する位置について
 
通知
すべてクリア

[解決済] ftell()で取得する位置について


XYZ
 XYZ
(@XYZ)
ゲスト
結合: 22年前
投稿: 8
Topic starter  

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()で位置を取得して、読みこんで、そのデータを
書き込めば終了、と安易に考えておりましたがなぜこのような処理で上手く
いかないのでしょうか。

どうかよろしくお願いいたします。


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

ftell() が返却する値は必ずしもファイルから読み取ったバイト数ではないからです。
ヘルプにも書いてあります。
ファイルの先頭から目標位置まで、ということなら、読み取り・チェックしながら
同時に書き出せばよいでしょう。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

躓いたらHELP(MSDN)を読みましょう。
HELPは宝の山といった人がいたとかいないとか。
掘り出すのにコツが必要だったりしますが、
これは回数こなして身につけるしかないです。
せめて、関数のHELPは最低でもチェック!

うまくたどると関連情報が芋づる式に出てくるのもMSDNの特徴かと。
検索をうまく利用して自己解決の手段としましょう。


返信引用
XYZ
 XYZ
(@XYZ)
ゲスト
結合: 22年前
投稿: 8
Topic starter  

>tetrapod様 PATIO様
 ご助言いただきありがとうございます。
 もう少し自分で確認してからにするように気をつけたいと思います。
 
 どうもありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました