gpt4 book ai didi

c - fgets不能完全填充数组

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:22 25 4
gpt4 key购买 nike

我想阅读一个文本文件,并将它存储在一个阵列data[512]
这是密码

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));
...
}

为什么每次都有不同的价值?为什么不完全填写?
编辑
When using strlen(data)inside a while loop:
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));

数据大小(“最后一条线”)不正确!
样品文本文件(“It is okay for all,except the first one where datareturns 513 instead of 512:
e IPsum Lorem只是印刷前作品和版式中使用的虚假文本。Ipsum Lorem是1500年代以来印刷厂的伪造标准文本,当时一个匿名画家聚集了一些文字,以制作一本文字字体样本。它不仅生存了五个世纪,而且还适应了计算机办公自动化,而其内容却没有改变。在1960年代,由于销售含有Lorem Ipsum的文章的Letraset,以及最近将其纳入文本版本应用程序,如Aldus Pagemaker.e Lorem Ipsum,该文章已广为人知。Ipsum Lorem是1500年代以来印刷厂的伪造标准文本,当时一个匿名画家聚集了一些文字,以制作一本文字字体样本。它不仅生存了五个世纪,而且还适应了计算机办公自动化,而其内容却没有改变。在1960年代,由于销售含有Lorem Ipsum的文章的Letraset,以及最近将其纳入文本版本应用程序,如Aldus Pagemaker.e Lorem Ipsum,该文章已广为人知。Ipsum Lorem是1500年代以来印刷厂的伪造标准文本,当时一个匿名画家聚集了一些文字,以制作一本文字字体样本。它不仅生存了五个世纪,而且还适应了计算机办公自动化,而其内容却没有改变。在1960年代,由于销售含有Lorem Ipsum的文章的Letraset,以及最近将其纳入文本版本应用程序,如Aldus Pagemaker.e Lorem Ipsum,该文章已广为人知。Ipsum Lorem是1500年代以来印刷厂的伪造标准文本,当时一个匿名画家聚集了一些文字,以制作一本文字字体样本。它不仅生存了五个世纪,而且还适应了计算机办公自动化,而其内容却没有改变。在1960年代,由于销售了含有Lorem Ipsum通道的Letraset薄片,以及最近将其纳入文本版式应用程序,如Aldus Pagemaker,该网站已广为人知。
IPsum Lorem只是印刷前作品和版式中使用的虚假文本。Ipsum Lorem是1500年代以来印刷厂的伪造标准文本,当时一个匿名画家聚集了一些文字,以制作一本文字字体样本。它不仅生存了五个世纪,而且还适应了计算机办公自动化,而其内容却没有改变。在1960年代,由于销售含有Lorem Ipsum的文章的Letraset,以及最近将其纳入文本版本应用程序,如Aldus Pagemaker.e Lorem Ipsum,该文章已广为人知。自从1500年代以来,当一个匿名画家聚集在一起

最佳答案

fgets做什么:
C库函数char*fgets(char*str,int n,FILE*stream)从指定的流中读取一行并将其存储到str指向的字符串中。当读取(n-1)个字符、读取换行符或到达文件结尾时(以先到者为准)停止。
所以在你的代码中:

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);

关于c - fgets不能完全填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26653094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com