使用C中的文件从数组中提取数字

时间:2017-02-12 20:14:34

标签: c arrays file

我想从文件中读取数字并将它们放入数组中。 问题是,虽然数字提取正确,但无法保存到数组。这意味着在执行程序后数组为空。我应该提一下这个代码是由一个线程使用的。 这是代码:

int ordercount=0;
//initialize
int Order[10]={0};
int Credit[10]={50,50,50,50,50,50,50,50,50,50};
//For reading a file
FILE *myfile;
//Semaphore
pthread_mutex_t mtx;
char char_get;



void *orders(void *arg)
{
///////////////////////////////////////////read from a file
    myfile=fopen("List.txt","r+");
    int k=0;
        //pthread_mutex_lock(&mtx);
        fscanf (myfile, "%d", &k);
        while (!feof (myfile))
        {
            ordercount++;
            Order[k]=k;
            printf("The initial Order is: %d \n",Order[k]);
            fscanf (myfile, "%d", &k);
        }
        fclose (myfile);
        //pthread_mutex_unlock(&mtx);

}

1 个答案:

答案 0 :(得分:2)

在你的循环中,您正在读取k中存储的整数值:

fscanf (myfile, "%d", &k);

在同一个循环中,您将k分配到列表

    ordercount++;
    Order[k]=k;

但不是使用ordercount(由于它在数组访问BTW之前递增,因为它太高了),您使用k作为索引。

如果值大于10,则在Order保留内存之外存储数据:未定义的行为。

(请注意,您的printf("The initial Order is: %d \n",Order[k]);语句似乎有效,因为它在作业完成后就没有了,并且它没有显示您存储k的顺序:您有这样的错觉:连续存储,而不是)

我会像这样改写:

    // don't perform the initial fscanf, do/while avoids that
    do
    {
        if (fscanf (myfile, "%d", &k)!=1)
        {
           printf("parsing error\n"); // maybe should exit if error?
        }
        printf("The initial Order is: %d @ %d \n",k,ordercount);
        Order[ordercount++]=k; // filling with values with increasing index, not random
    }
    while (!feof (myfile) || ordercount==sizeof(Order)/sizeof(Order[0]));

(使用do/while并防止文件中包含过多的值)