2012-12-12 94 views
1

我想從文本文件中讀取80個字符,將它們保存爲字符串,然後打印該字符串以進行驗證。 我使用的fread和有這樣的代碼:從文本文件讀取fread時獲取' '或'@'符號

char message[80]; 
size_t nread = fread(message, 1, sizeof(message), fp); 
printf("Message received: \"__%s__\"\n", message); 

,輸出是:收到

消息:「__I很想改變這個世界,但他們不會
__」

當整個短語是不是在文件中

和:

__I很想改變這個世界,但他們不會給我的源代碼
@__

當整個短語在文件中。

我試過刪除它並重寫文本,但我再次得到相同的輸出。

出了什麼問題?與charset有什麼關係?

+1

嘗試'消息[nread] = 0'。 – cnicutar

+1

@cnicutar,如果它讀了'80',那麼這將是'message'結尾的一個。 – hmjd

+0

@hmjd是的,在此之前必須檢查'nread'。或者只是將sizeof - 1傳遞給'fread'。 – cnicutar

回答

6

fread()不會終止緩衝區,並且prinf("%s")預計緩衝區會被終止。由於緩衝區不是空終止printf()將繼續讀取,直到它找到一個空終止符,沿途打印出任何垃圾。

無論是空終止緩衝區,記住要留有餘地空終止:

char message[81]; /* Increased by 1 for null terminator. */ 
size_t nread = fread(message, 1, sizeof(message) - 1, fp); 
message[nread] = 0; 
printf("Message received: \"__%s__\"\n", message); 

或指示printf()僅打印字符數讀取使用"%.*s"格式說明:

printf("Message received: \"__%.*s__\"\n", nread, message); 
+0

太棒了!我以爲它沒有終止與_message [nread] ='\ 0'; _的緩衝區。所以我認爲我會終止它。但是,你能否向我解釋一下你在用printf做什麼?用'*'表示nread變量? – Chris

+1

@Chris,'「%。* s」'是一個格式說明符,它需要兩個參數:一個長度和一個緩衝區。它指示'printf()'從'message'打印第一個'nread'字符,消除'message'中的空終止符的要求。 – hmjd

+0

謝謝!我其實並不知道printf。 – Chris