2011-12-04 29 views
-1

的FSEEK並在FSEEK值0L這是什麼值也意味着SEEK_END從最終意味着還幫我EOF CTRL + ž不工作更多的理解與FSEEK()和EOF IN C

void modify() 
{ 
int ch1; 
FILE *f1; 
char c,*word,*sent,fname[20]; 
printf("Enter the filename to be modified: "); 
scanf("%s",fname); 
if(searchpath(fname)) 
    { 
    printf("\n1.Character"); 
    printf("\n2.Word"); 
    printf("\n3.Sentence"); 
    printf("\nEnter U'r choice: "); 
    scanf("%d",&ch1); 
    if(ch1==1) 
     { 
     f1=fopen(fname,"a+");//use to search the fiel in path variables 
     fseek(f1, 0L, SEEK_END); 
     printf("Enter the character and CTRL+Z to exit:\n "); 
     while((c=getchar())!=EOF) 
      { 
      putc(c,f1); 
      } 
     } 
    else if(ch1==2) 
     { 
     printf("Enter the word: "); 
     scanf("%s",word); 
     f1=fopen(fname,"a+"); 
     fseek(f1, 0L, SEEK_END); 
     fputs(word,f1); 
     } 
    else 
     { 
     printf("Enter the sentence and CTRL+Z to exit: "); 
     f1=fopen(fname,"a+"); 
     fseek(f1, 0L, SEEK_END); 
     while((c=getchar())!=EOF) 
     { 
     putc(c,f1); 
     } 
     } 
    } 
else 
printf("\nFilename does not exist"); 
fclose(f1); 
} 

當我運行代碼並調用 printf(「輸入字符和CTRL + Z退出:\ n」); ((c = getchar())!= EOF) { putc(c,f1); } 和當我點擊CTRL + Ž我得到 - >箭頭標記和輸入i達到無限循環 也使用 fflush(標準輸入); 它丟失了文件的地址並且抓取了一些垃圾地址,

回答

1

你有幾個問題,我會把大的一個保存到最後。

首先,您的無限循環可能是由您使用getchar的方式產生的。

getchar返回從標準輸入讀取的字符的值。如果出現錯誤或文件結束,它將返回EOF(與平臺相關的值,但通常爲-1)。但是,如果在調用程序時將文件重定向到stdin,即文件可能會結束,文件結束(可能取決於您的平臺)纔會真正發生。

CTRL-Z可能在某些平臺上被解釋爲文件結束,可能與CTRL-D一樣,但這肯定不是普遍的,我也不確定它們中的哪一個。

如果CTRL-Z不解釋爲文件結束,它可能有兩個可能的結果。一個是強行中斷你的程序,有點像Windows命令提示符中的CTRL-Break。另一個是CTRL-Z被視爲與其他任何按鍵相同的按鍵,可能導致從getchar返回字符代碼26。

接下來,我不認爲你需要fseek,因爲你的開放模式是「a +」,儘管它對我來說看起來並沒有錯 - 但是我不再使用C足以確保更多。

最後 - 我也認爲你有一個嚴重的問題,你如何使用scanf,這是導致嚴重的未定義的行爲。看看下面的行...

scanf("%s",word); 

你的變量word定義如下......

char c,*word,*sent,fname[20]; 

OK,這是一個指針到字符 - 但指針未初始化。您需要一個內存緩衝區來保存輸入文本,並且您需要初始化指針。通常情況下,它更容易聲明word的字符,如數組...

char word [100]; 

這確保了有一些可用來保存生成的字符串的內存,但不保證內存緩衝區足夠大。這一點對現實世界的編程來說是嚴重的,但可能不是現在應該擔心的事情。

有什麼奇怪的是,你似乎已經解決了這個問題fname。這表明,您可能會自動應用人們的建議來修復代碼而不理解問題,這有點令人擔憂。我會給你一個警告,因此 - 目前你似乎沒有使用sent,但是如果打算以與wordfname相同的方式使用,它將具有與word相同的問題。