如何在C语言中将一大组数据存储到数组中

如何在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

我有一个名为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;
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)
作为循环的终止条件。