2014-10-30 71 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