2014-10-30 74 views
1

我想讀取文本文件並將其存儲到數組中data[512]fgets未將陣列完全填充

下面是代碼:

char filename = "send.txt"; 

//Open File 
FILE *in_file = fopen("send.txt", "r"); 

if(in_file == NULL){ 
    printf("Error : couldn't oepn file"); 
} 

char data[512]; 
while(fgets(data, sizeof(data), in_file) != NULL){ 
    printf("read size: %d \n", strlen(data)); 
    ...  
} 

爲什麼strlen(data)每次返回不同的值?爲什麼data未完全填充?

編輯

當使用fread() while循環中:

printf("Start Reading \n"); 
memset(&data[0], 0, sizeof(data)); 
size_t numRead = fread(data,1,sizeof(data),in_file); 
printf("numRead: %d \n", numRead); 
if(numRead == NULL) 
{ 
    printf(" fread() failed\n"); 
    return 1; 
}    
printf("data size: %d \n", strlen(data)); 

的數據大小(最後一行)是不正確的!

樣品TEXTFILE(它是確定所有除了第一個,其中strlen返回513,而不是512):

ËLorem存有EST simplement杜人造texte僱工丹斯LA組合物等拉瀨烯頁前衛的印象。 Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis lesannées1500,quand un peintre anonyme assembles ensemble des des morceaux de texte pourréaliserun livrespécimende polices de texte。如果你沒有證據證明你的生活有任何危險,你可以通過改變你的信息,無條件地改變你的生活。 Il aétépopularisédans lesannées1960grâceàla vente de feuilles Letraset contenant des passage du Lorem Ipsum,et,plusrécemment,par son dans des applications de mise en page de texte,comme Aldus PageMaker.e Lorem Ipsum est simplement du人爲的印象將會給人以深刻的印象。 Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis lesannées1500,quand un peintre anonyme assembles ensemble des des morceaux de texte pourréaliserun livrespécimende polices de texte。如果你沒有證據證明你的生活有任何危險,你可以通過改變你的信息,無條件地改變你的生活。 Il aétépopularisédans lesannées1960grâceàla vente de feuilles Letraset contenant des passage du Lorem Ipsum,et,plusrécemment,par son dans des applications de mise en page de texte,comme Aldus PageMaker.e Lorem Ipsum est simplement du人爲的印象將會給人以深刻的印象。 Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis lesannées1500,quand un peintre anonyme assembles ensemble des des morceaux de texte pourréaliserun livrespécimende polices de texte。如果你沒有證據證明你的生活有任何危險,你可以通過改變你的信息,無條件地改變你的生活。 Il aétépopularisédans lesannées1960grâceàla vente de feuilles Letraset contenant des passage du Lorem Ipsum,et,plusrécemment,par son dans des applications de mise en page de texte,comme Aldus PageMaker.e Lorem Ipsum est simplement du人爲的印象將會給人以深刻的印象。 Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis lesannées1500,quand un peintre anonyme assembles ensemble des des morceaux de texte pourréaliserun livrespécimende polices de texte。如果你沒有證據證明你的生活有任何危險,你可以通過改變你的信息,無條件地改變你的生活。 Il aétépopularisédans lesannées1960grâceàla vente de feuilles Letoraset con desant des passage du Lorem Ipsum等人,加上包括德文技術在內的應用程序,請瀏覽Aldus PageMaker。 Le Lorem Ipsum est simplement du texte employte dans la composition et la mise en page avant impression。 Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis lesannées1500,quand un peintre anonyme assembles ensemble des des morceaux de texte pourréaliserun livrespécimende polices de texte。如果你沒有證據證明你的生活有任何危險,你可以通過改變你的信息,無條件地改變你的生活。它推廣20世紀60年代與含Lorem存有通道,以及Letraset張釋放最近,通過將其列入文本佈局應用程序,如奧爾德斯PageMaker.e Lorem存有簡直是打印前虛擬文本成分和佈局。 Lorem存有標準的虛擬文本自1500年有史以來,當一個未知的聚集件

一起
+1

使用龜etc(),它是沒有效率的,目的是你相信它會被填滿。 – user2090491 2014-10-30 12:33:48

+1

顯示文件內容.. – 2014-10-30 12:38:50

+0

它是可行的,在此附上文件? – 2014-10-30 12:56:47

回答

3

是什麼fgets做:

C庫函數的char *與fgets(字符*海峽,INT N,FILE *流)讀取指定的流,並將其存儲到字符串指向線海峽。當它停止要麼(N-1)個字符被讀取,換行符被讀出,或最終的文件是atteint,先到者爲準。

因此,在你的代碼:

fgets(data, sizeof(data), in_file); 

會讀最多 511輛坦克,瞄準它就會停止閱讀盎司新行或EOF遇到的一年。
如果你想閱讀儘可能多的坦克有data數組大,那麼無論是讀「時間一個接一個,使用fgetc,或致電在一個循環的內容fgets,每次讀取數據的其餘部分追加到的data結束。一個未經測試例如:

size_t data_len = 0, 
    total_len = 0, 
    max_len = sizeof data/sizeof *data;//sizeof *data is one, unless you decide to use w_char or something 
while ((fgets(data + data_len, max_len - data_len, in_file)) != NULL) 
{ 
    data_len = strlen(data); 
    if (data_len >= 511)//==511 should work, but you never know 
    { 
     total_len += data_len;//keep running total 
     data_len = 0; 
     printf("%s\n", data); 
     data[0] = '\0';//make empty string 
    } 
} 
if (data_len) 
    printf("%s\nread size: %zu\n", data, total_len + data_len); 
3

與fgets()將讀取到它達到一個新行或文件的末尾。如果你的文件必須通過不同長度的換行分隔行。

使用fread()相反,它將作爲你告訴它,除非它擊中文件的末尾讀作絕。

+0

我使用的fread()是這樣的: – 2014-10-30 13:18:46

1

你必須決定,如果這是一個文本文件,或者你正在閱讀的二進制文件。如果它是一個文本文件和fgetsstrlen是正確的,你正在閱讀一行行,所以什麼是閱讀的長度會有所不同。

如果這是一個二進制文件使用fread,目標從來就不是在緩衝區裏strlen。巧合的是你的緩衝區可能具備0字節,因此論文是否肯strlen被解釋爲結束串字符。

+0

這是一個文本send.txt file.It是確定所有除了第一個魁strlen的retrun 513 INSTEAD OF 512。 ..可能是什麼原因? – 2014-10-30 13:53:29

+1

@ H'H:如果''一個char的strlen' [512]'大於511(字符串是用terminating' \ 0'坦克陣列),你在調用UB(未定義行爲)的風險 – 2014-10-30 14:14:13

+0

有沒有避免這種方式? – 2014-10-30 14:16:05