如何在C语言中将一大组数据存储到数组中
我有一个名为somedata.dat的数据文件,它包含一个数字对列表。大约一万双。像这样:如何在C语言中将一大组数据存储到数组中,c,C,我有一个名为somedata.dat的数据文件,它包含一个数字对列表。大约一万双。像这样: 3 19 5 213 1 34 7 93 我尝试打开文件并读取它们,然后将数字放入10000x2数组中。然而,对于下面的代码,当循环到达大约第80000次时(不用说EOF),它停止运行。有什么想法吗?谢谢 int main(int argc, char *argv[]) { int data[10000][2]; FILE *fp; char s[5]; char temp[2]; char cur
3 19
5 213
1 34
7 93
我尝试打开文件并读取它们,然后将数字放入10000x2数组中。然而,对于下面的代码,当循环到达大约第80000次时(不用说EOF),它停止运行。有什么想法吗?谢谢
int main(int argc, char *argv[])
{
int data[10000][2];
FILE *fp;
char s[5];
char temp[2];
char cur;
char next;
int pid=0;
int k=0;
fp = fopen("c:\\somedata.dat","r");
while (!EOF)
{
cur = fgetc(fp);
if (cur==' ')
{
data[pid][0]=atoi(s);
memset(&s[0], 0, sizeof(s));
}
else if (cur=='\n')
{
data[pid][1]=atoi(s);
pid++;
memset(&s[0], 0, sizeof(s));
}
else
{
temp[0]=cur;
temp[1]='\0';
strcat(s,temp);
}
}
你写了:
while (k!=80000)
可能是停在80.000的原因编辑:
您定义了一个20000的数组,并尝试添加大约10000个paris,但它停止在80000
我猜是这样的,因为循环中没有中断,它读取10000,然后读取70000次EOF+对数组执行一些奇怪的操作。然后退出
您必须将
EOF
与其他内容进行比较
通常:
int c; /* Has to be int, not char */
while((c = fgetc(fh)) != EOF) {
...
}
还有,;看看,从stdio.h。也许更适合你的使用
还有,
fgetc()
检索一个和一个可表示为char或EOF的int
即文件:
12 33
16 693
然后fgetc将检索:
1: '1'
2: '2'
3: ' '
4: '3'
5: '3'
6: '\n'
7: '1'
8: '6'
...
进一步:在使用函数时检查。如果fgetc()返回EOF,则表示您处于EOF或发生读取错误。与费罗等核对
可以建立和存储阵列。然而,使用malloc确实更有意义。谢谢大家。
而(k!=80000)
--你确定没有要求它停止工作吗?我绝对不是C专家。但是这样大的数组应该在堆中。malloc it。您应该使用堆分配数组(使用calloc
)来处理大型数据集。您没有正确处理fgetc
的返回值。您应该缩进代码以更好地找到匹配的括号。EOF是一个常量,它的值是多少?您应该将EOF与读取的数据进行比较。嗯,我只是尝试使while循环到达文件的末尾。。。我想!EOF可以做到……最好使用while(true)以避免混淆。(或尽管(1))@EastBounder EOF不是一个函数,而是一个常量。如果EOF为i.e.-1,则while(!EOF)表示while(!-1),或始终为false。谢谢,但您知道如何优化代码,使其在循环超过80000次时不会卡住吗?谢谢我想说的是,他必须在他的案例中使用fscanf。代码中没有内在的“80000”限制。如果您有一个10000行的文件和20000个数组,它将在文件结束时停止(注意缓冲区溢出)@EastBounder-您不想在EOF之后继续添加/读取。还是我遗漏了什么?@user120115:使用feof(fh)
作为循环的终止条件。