fgets() 直到 while 循环中的文件末尾才继续
fgets() doesn't continue until to the end of the file in the while loop
我需要读一个文件直到它结束,但它在结束前中断了。这是我的文件;
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
注意:我从显示标记的编辑器中获得了屏幕截图
这是从文件中正确读取数据的程序 -
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct data{
char *key;
char *value;
}pairs[20];
int main(void) {
FILE *fp;
int i=0;
char line[255],search[2]=" ";
char *token;
fp=fopen("Results.txt","r");
if(fp!=NULL){
while(fgets(line,sizeof line,fp)!=NULL){ // read from file
pairs[i].key=NULL; // setting to NULL
pairs[i].value=NULL; // setting to NULL
token=strtok(line, search);
if(token!=NULL){ // check its return
pairs[i].key = strdup(token);
}
token=strtok(NULL, search);
if(token!=NULL){ // check its return
pairs[i].value = strdup(token);
}
if(pairs[i].key!=NULL && pairs[i].value!=NULL) //check return from strdup
printf("%s %s\n",pairs[i].key,pairs[i].value); //print values
i++;
}
}
for(int j=0;j<i;j++) {
free( pairs[i].key);
free( pairs[i].value);
}
fclose(fp);
}
我不知道你的声明,所以也不知道。
编辑 2
你在这个主题上的 previous question 表明你一次处理来自文件 1000 行的数据,对于这 1000 行中的每一行你调用 strdup
两次(文本中的每个数据字段一次)线)。您还说“我有一个包含 2^32 key/value 对 的文件”。
对于其中的每一个,您调用 strdup
两次,每个数据字段一次。现在,strdup
分配内存来保存要复制的字符串。有了海量的数据,那就是大量的内存,程序会因为缺少它而停止运行。
所以我建议在处理每 1000 行输入后,释放内存,类似这样 - 请适应您的需要,因为您从未显示完整代码。
for (i=0; i<1000; i++) {
free(pairs[i].key);
free(pairs[i].value);
}
检查任何 return 错误提示值的库函数的 return 值本质上是一种很好的做法。在 strdup
的情况下,它会告诉您是否 运行 内存不足。在 strtok
的情况下,你会知道文件中有一个你无法解释的流氓行 - 可能是文件末尾的一个空行,由 newline
.
终止
其次,上一个问题中的评论表明 char line [c]
is defined as 41 char because my every line can be maximum 41.
现在,64 位 unsigned int
中最多有 20 个十进制数字。其中两个加上一个 space
得到 41。 字符串终止符怎么样? 而通常位于通过获得的输入末尾的 newline
呢fgets
?我建议您将 c
的定义(您从不显示)更改为
#define c 50
因为没有理由对单一的弦长进行紧缩。当您调用 strdup
时,只会为字符串长度 + 终止符分配足够的内存,因此根本不会浪费内存。
我需要读一个文件直到它结束,但它在结束前中断了。这是我的文件;
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
注意:我从显示标记的编辑器中获得了屏幕截图
这是从文件中正确读取数据的程序 -
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct data{
char *key;
char *value;
}pairs[20];
int main(void) {
FILE *fp;
int i=0;
char line[255],search[2]=" ";
char *token;
fp=fopen("Results.txt","r");
if(fp!=NULL){
while(fgets(line,sizeof line,fp)!=NULL){ // read from file
pairs[i].key=NULL; // setting to NULL
pairs[i].value=NULL; // setting to NULL
token=strtok(line, search);
if(token!=NULL){ // check its return
pairs[i].key = strdup(token);
}
token=strtok(NULL, search);
if(token!=NULL){ // check its return
pairs[i].value = strdup(token);
}
if(pairs[i].key!=NULL && pairs[i].value!=NULL) //check return from strdup
printf("%s %s\n",pairs[i].key,pairs[i].value); //print values
i++;
}
}
for(int j=0;j<i;j++) {
free( pairs[i].key);
free( pairs[i].value);
}
fclose(fp);
}
我不知道你的声明,所以也不知道。
编辑 2
你在这个主题上的 previous question 表明你一次处理来自文件 1000 行的数据,对于这 1000 行中的每一行你调用 strdup
两次(文本中的每个数据字段一次)线)。您还说“我有一个包含 2^32 key/value 对 的文件”。
对于其中的每一个,您调用 strdup
两次,每个数据字段一次。现在,strdup
分配内存来保存要复制的字符串。有了海量的数据,那就是大量的内存,程序会因为缺少它而停止运行。
所以我建议在处理每 1000 行输入后,释放内存,类似这样 - 请适应您的需要,因为您从未显示完整代码。
for (i=0; i<1000; i++) {
free(pairs[i].key);
free(pairs[i].value);
}
检查任何 return 错误提示值的库函数的 return 值本质上是一种很好的做法。在 strdup
的情况下,它会告诉您是否 运行 内存不足。在 strtok
的情况下,你会知道文件中有一个你无法解释的流氓行 - 可能是文件末尾的一个空行,由 newline
.
其次,上一个问题中的评论表明 char line [c]
is defined as 41 char because my every line can be maximum 41.
现在,64 位 unsigned int
中最多有 20 个十进制数字。其中两个加上一个 space
得到 41。 字符串终止符怎么样? 而通常位于通过获得的输入末尾的 newline
呢fgets
?我建议您将 c
的定义(您从不显示)更改为
#define c 50
因为没有理由对单一的弦长进行紧缩。当您调用 strdup
时,只会为字符串长度 + 终止符分配足够的内存,因此根本不会浪费内存。