我需要读取文件直到结束,但它会在结束前中断。这是我的档案;
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++;
}
}
它有效,但直到最后。在循环结束后阅读下面的部分。这可能是什么原因?每行以\ n符号结尾。
8378749330196451143 7761927347639996843
3597172149842452783 2722311582032048570
6413963814675220040 151985128848019557
2797849130305409931 7006855242872793130
2312483514986641752 4723009976223322840
6299327914512777856 8560986736619134288
7840374864908954188 6413325942318176938
7120263339634576853 572101923
注意:我从编辑器中获得了显示标记的屏幕截图
答案 0 :(得分:4)
编辑2
关于此主题的previous question表示您正在处理来自文件1000行的数据,对于您调用strdup
两次的这1000行中的每一行(对于文本行中的每个数据字段一次) 。您还说" 我有一个包含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]
定义为41个char,因为我的每行最多可以为41个。
现在,64位unsigned int
中最多有20位小数。其中两个加上一个space
生成41. 字符串终止符怎么样?那么newline
通常会在{{1}获得的输入结尾}}?我建议你将fgets
(你从未表现出来)的定义改为
c
因为单个字符串长度没有理由紧张。当你调用#define c 50
时,它只会为字符串长度+终结符分配足够的内存,所以它根本不会浪费大量内存。
答案 1 :(得分:1)
这是从文件中正确读取数据的程序 -
#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);
}
我不知道你的声明,所以也是如此。