2013-01-18 59 views
3

我有最奇怪的事情發生,我不太確定它爲什麼會發生。基本上我需要做的就是使用fgetc逐字節地獲取簡單ASCII文件的內容。奇怪的部分是它的工作,但後來我又添加了幾個字符,突然間它添加了一個不在那裏的新行,並且讀過文件末尾或其他東西。從字面上看,我所做的是C - 用fgetc讀取文件末尾

do { 
    temp = (char*) checked_realloc (temp, n+1); 
    e = fgetc(get_next_byte_argument); 
    temp[n] = e; 
    if (e != EOF) 
     n++; 
} 
while (e != EOF); 

然後檢查我剛剛打印每個字符出來

temp_size = strlen(temp)-1; 
for(debug_k = 0; debug_k < temp_size; debug_k++){ 
    printf("%c", temp[debug_k]); 
} 

它除了它增加了一個額外的換行符,這不是在文件中正確輸出的一切。在此之前,我有

temp_size = strlen(temp); 

但是,它結束了一些未知的字節(打印亂碼)。我試過strlen(temp)-2以防萬一,並且它爲那個特定的文件起作用,但是後來我在結尾添加了一個額外的「a」,並再次打破。

我被老實說服了。我不知道爲什麼這樣做。

編輯:checked_realloc只是realloc,但有一個快速檢查,以確保我沒有內存不足。我意識到這不是最有效的方法,但我更擔心爲什麼我似乎在額外的字節中奇蹟般地閱讀。

+0

爲了使'strlen(temp)'工作,在文件內容之後應該有一個終止的NUL字符。你沒有顯示添加這個最終'\ 0'的代碼 - 你有嗎? –

+0

如果checked_realloc()只是realloc,嘗試在讀取之前用0初始化內存。 –

+0

Oooooh ... duh。我完全忘記了這一點。謝謝!順便說一下,因爲這是EOF的最後一個字符,應該NULL替換還是隻是後來?我可能會通過試驗和錯誤,但我不妨問 – user1777900

回答

1

寫這樣的操作更安全的方法是:

  1. memset的內存批量用零使用之前,如果您分配內存之前realloc.And每次realloc的時候,其初始化爲零。
  2. 如果您正在使用內存訪問字符串或在該內存上使用字符串函數,請務必使用NULL字節終止該內存。

do{ 
    temp = (char*) checked_realloc (temp, n+1);//I guess you are starting n with 0? 
    temp[n]=0; 
    e = fgetc(get_next_byte_argument); 
    temp[n] = e; 
    if (e != EOF) 
     n++; 
} while (e != EOF); 
temp[n]=0; 
n=0; 

我想上面的代碼更改應解決您的問題。你不需要strlen -1了。 :)

乾杯。

+0

這似乎已經做到了!奇怪的是還有一個不在我文件中的換行符,但它是一致的。也許沒有新行可能是亂碼被打印。 – user1777900

+0

沒有。 OP正在使用fgetc啓動e,並將temp [n]的值存儲爲e。如果OP得到EOF,那麼在達到while條件之前,n ++不會發生,temp [n]仍然包含EOF。在退出tem [n]後將始終包含EOF(除非由其他原因退出循環),temp [n ] = 0之後,while循環將安全地覆蓋temp [n]中包含的EOF。 :) – askmish

0

這聽起來像你忘了null終止你的字符串。在while之後添加temp[n] = 0;