gpt4 book ai didi

c - fgets() 不会继续直到 while 循环中的文件末尾

转载 作者:行者123 更新时间:2023-11-30 18:25:05 26 4
gpt4 key购买 nike

我需要读取一个文件直到其结束,但它在结束之前中断。这是我的文件;

8378749330196451143 7761927347639996843
3597172149842452783 2722311582032048570
6413963814675220040 151985128848019557
2797849130305409931 7006855242872793130
2312483514986641752 4723009976223322840
6299327914512777856 8560986736619134288
7840374864908954188 6413325942318176938
7120263339634576853 5721019237600873947
4064508404151769878 8332513917413808407
1131946326472490896 8768732125304950625
2593825059274639432 4898919688177170005
1152428805919273221 4955899780218674181
4762291655892416501 1286985264509566046
1098025338340897985 4952984927278789363
2524421559647997815 8843945302342585201

我正在使用这部分代码来获取行;

file = fopen ( buffer, "r" );
if ( file != NULL ){
while ( fgets ( line, sizeof line, file ) != NULL ) {
// Token will point to the part before the =.
pairs[i].key = strdup(strtok(line, search));
// Token will point to the part after the =.
pairs[i].value = strdup(strtok(NULL, search));

i++;
}
}

它有效,但不到最后。阅读下面的部分后 while 循环结束。这可能是什么原因?每行以\n 符号结尾。

8378749330196451143 7761927347639996843
3597172149842452783 2722311582032048570
6413963814675220040 151985128848019557
2797849130305409931 7006855242872793130
2312483514986641752 4723009976223322840
6299327914512777856 8560986736619134288
7840374864908954188 6413325942318176938
7120263339634576853 572101923

注意:我从编辑器中获得了显示标记的屏幕截图

enter image description here

最佳答案

编辑2

您的previous question本主题表示您一次处理文件中的数据 1000 行,对于这 1000 行中的每一行,您调用 strdup 两次(针对文本行中的每个数据字段调用一次)。您还说过“我有一个包含 2^32 个键/值对的文件”。

对于每个数据字段,您调用 strdup 两次,每个数据字段一次。现在,strdup 分配内存来保存要复制的字符串。由于数据量很大,因此需要大量内存,程序会因缺少内存而停止运行。

因此,我建议在处理每 1000 行输入后,释放内存,类似这样 - 请适应您的需求,因为您从不显示完整的代码。

for (i=0; i<1000; i++) {
free(pairs[i].key);
free(pairs[i].value);
}

检查任何返回错误提示值的库函数的返回值本质上是一种很好的做法。对于 strdup 来说,它会告诉您是否内存不足。在 strtok 的情况下,您会知道文件中存在您无法解释的恶意行 - 可能是文件末尾的空行,以 newline 终止。

其次,上一个问题中的评论表明char line [c]

is defined as 41 char because my every line can be maximum 41.

现在,64 位 unsigned int 中最多有 20 位十进制数字。其中两个加上一个空格组成41。字符串终止符怎么样?通常位于字符串末尾的换行符又怎么样? fgets 获取输入?我建议你将 c 的定义(你从不显示它)更改为类似

#define c 50

因为没有理由限制单个字符串的长度。当您调用 strdup 时,只会为字符串长度+终止符分配足够的内存,因此根本不会浪费太多内存。

关于c - fgets() 不会继续直到 while 循环中的文件末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33243170/

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