2016-04-21 56 views
0

因此,我應該編寫一段代碼,打開一個名爲「單詞」的文件,並將文件中的最後一個單詞寫入名爲「lastword」的文件。這是我到目前爲止:如何讀取文本文件中的最後一個單詞和C中的另一個文本文件?

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


fclose(fp) 
fclose(f); 

這裏的問題是,我不知道如何閱讀文本文件的最後一個字。我怎麼知道哪個詞是最後一個詞?

回答

1

這與tail工具的作用類似,您需要從文件的末尾找到一定的偏移量,然後在該處讀取該塊,然後向後搜索,一旦遇到空白或換行,就可以打印從那裏說話,那就是硬道理。基本的代碼如下所示:

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:*對於文本流,任一偏移量應爲零,或者偏移量應爲先前成功調用函數返回的值函數在與同一個文件相關的數據流上,因此應該是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; 
} 
相關問題