c - 从文件中将数据读入数组

时间:2014-10-31 19:03:58

标签: c arrays linux

我必须为使用并行数组来存储学生成绩数据的类做一个程序。我们将使用Linux命令“<”来提供数组数据执行程序时。

./a.out < inputfile

然而,当我运行程序时,我得到一个程序用来访问数组中数据的菜单的无限循环。看起来程序正在跳过我正在使用的函数来填充函数中的数组,并使用文件中的数据作为单独函数中的菜单scanf()。

这是我用来填充数组的函数:

void populate(int idarray[],int testone[], int testtwo[],float hw[],int max)
{   
    int counter = 0;
    while(scanf("%d", &idarray[counter]) != EOF)
    {
        if(idarray[counter] != -1)
        {
            //scanf("%f %d %d", &hw[counter], &testone[counter], &testtwo[counter]);

            scanf("%f",&hw[counter]);
            scanf("%d",&testone[counter]);
            scanf("%d",&testtwo[counter]);
            counter++;
        }
        if(counter == max-1)
           break;
   }
}

“max”是数组的范围。

输入文件如下所示:

1983990 75.6 39 78 1935440 50.03 78 34

2 个答案:

答案 0 :(得分:1)

检查你的while循环是否因counter == max - 1或EOF而中断。如果它是前者那么你仍然会在stdin中输入,这将作为你的菜单选项的输入而不受你的控制

说明: 如果你的while循环因&#34; counter == max -1&#34;而中断?这意味着你的&#34; max&#34;(数组大小)较小 而不是输入文件中的输入总数(十进制数)。如果你的&#34; max&#34;(数组大小)合适,那么它只会被EOF破坏。 现在,如果在达到EOF之前有一段时间中断,那意味着你没有消耗你传递给stdin的所有输入十进制数,这意味着将有剩余的输入数字被消耗 甚至在你的while循环结束后。这种尚未消耗的输入将被消耗(在其他方面 单词将作为输入提供给您的菜单选项&#34; scanf&#34; (可以选择下一个动作)。这就是光标没有等待您为菜单选择提供输入的原因

您也可以按照之前的答案(I am not able to flush stdin)强制清除stdin缓冲区 调用您的菜单功能,以便它等待您的输入选择

答案 1 :(得分:0)

我没有看到您的功能出现任何严重错误,但您的终止标准似乎已被一个人拒之门外。如果在现在测试的地方进行测试,那么真的是两个。想想max为0或1时会发生什么。

为了适应max为0的可能性,您需要在每次循环迭代的最开始时(正确地)测试终止条件,然后再读取任何

另外,我更倾向于测试不等式而不是等式,因为当我的索引有点错误时,这会更好地控制不当行为。所以在这种情况下,我会在counter >= max时中断或仅在counter < max时执行迭代。