2016-04-21 14 views
0

私は "words"というファイルを開き、ファイルの最後の単語を "lastword"というファイルに書き込むコードブロックを書きます。これはこれまで私が持っていたものです:テキストファイルの最後の単語とCの別のテキストファイルを読み込む方法は?

FILE *f; 
FILE *fp; 
char string1[100]; 
f = fopen("words","w"); 
fp=fopen("lastword", "w"); 
fscanf(f, 


fclose(fp) 
fclose(f); 

ここでの問題は、テキストファイルの最後の単語の読み方がわかりません。どの言葉が最後の言葉であるかは、どのようにわかりますか?

答えて

1

これは、ファイルの最後から一定のオフセットを求めてそこのブロックを読み取り、後方を検索し、空白または改行を満たしたら、そこからの単語、それが最後の単語です。

char string[1024]; 
char *last; 
f = fopen("words","r"); 
fseek(f, SEEK_END, 1024); 
size_t nread = fread(string, 1, sizeof string, f); 
for (int I = 0; I < nread; I++) { 
    if (isspace(string[nread - 1 - I])) { 
     last = string[nread - I]; 
    } 
} 
fprintf(fp, "%s", last);  

ワード境界が最初のブロックが見つからない場合は、あなたがそれを見つけるまで、最後から二番目のブロックを読み込み、それを検索し、第三を続け、その後、すべての印刷:基本的なコードは次のようになります。位置よりも後の文字。

+0

おそらくファイルが大きい場合はおそらく最も良い方法です。あなたの "言葉"がこれよりも大きい場合は、ファイルの最後から始めると問題が起きる可能性があります。 –

+0

はい、正確です。検索は単語が見つかるまで続きます。 – fluter

+0

ニースのアプローチ!しかし、テキストモードでファイルの最後から読み込むことは移植性がありません。 "7.21.9.2:*テキストストリームの場合、オフセットはゼロでなければなりません。オフセットはftellへの前回の正常呼び出しで返された値です同じファイルに関連付けられたストリーム上で機能し、SEEK_SETとなる。* " - 参照:http://www.cplusplus.com/reference/cstdio/fseek/ – Christophe

1

これにはさまざまな方法があります。

簡単な方法

一つの簡単な方法は、言葉を読んだ上でループにすることです:

f = fopen("words.txt","r"); // attention !! open in "r" mode !! 
...  
int rc; 
do { 
    rc=fscanf(f, "%99s", string1); // attempt to read 
} while (rc==1 && !feof(f)); // while it's successfull. 
... // here string1 contains the last successfull string read 

は、しかし、これはスペースで区切られた文字の任意の組み合わせとしての単語を取ります。バッファオーバーフローがないことを確認するために、scanf()形式のwithフィールドを使用することに注意してください。

rc=read_word(f, string1, 100); 
:あなたは言葉の厳格な定義をしたい場合は

より正確な方法

ビル前の試みで、あなたは自分自身の機能を()scanf関数の呼び出しを置き換えることができます

この関数は次のようなものになります。

int read_word(FILE *fp, char *s, int szmax) { 
    int started=0, c; 
    while ((c=fgetc(fp))!=EOF && szmax>1) { 
     if (isalpha(c)) { // copy only alphabetic chars to sring 
      started=1; 
      *s++=c; 
      szmax--;  
     } 
     else if (started) // first char after the alphabetics 
      break;   // will end the word. 
    } 
    if (started) 
     *s=0;  // if we have found a word, we end it. 
    return started; 
} 
関連する問題