1

我在为程序使用多维数组时遇到了一些麻烦。本质上,该程序使用 scanf 从重定向文件中读取用户 ID 和字符串。文件格式是一个三位数的用户 ID、一个空格和一串字符,表示每行测试中多项选择题的答案,例如。

111 dabac
102 dcbdc
251 dbbac

我遇到的问题是我不知道有多少用户,并且我无法多次读取文件数据。我试过使用

for (lineNumber = 0; lineNumber != -1; lineNumber++)
{
int result = scanf("%d ", &data);
if (result == EOF)
  break;
for(i = 0; i < numProblems; i++)
{
  scanf("%c", &input);
}

获取文件中的行数,然后设置数组的大小。然后将数组传递给另一个读取数据的函数,使用相同的 for 循环,但使用

input = arrayName[numProblems][lineNumber];

在第二个 for 循环中。我遇到的问题是 scanf 只能从文件中读取一次数据,并且在初始化之前我无法将数据存储在数组中,这需要我知道有多少用户。

按照我的设置方式,程序可以找到行数(用户)或将数据存储在数组中(如果我将大小设置为任意数字),但不能同时找到两者。

我必须使用scanf,因为文件名不是恒定的(这也是一个类......教授需要使用scanf),我不知道如何获取文件中的行数和仍然可以读取数据。如果有人知道在不使用 scanf 的情况下查找行数或读取数据两次的解决方法,我将非常感谢一些帮助。如果它有助于发布整个程序,我也可以这样做。

谢谢,

埃里克

4

3 回答 3

0

幸运的是,scanf() 将一次性将整行解析为多个变量。尝试更多类似的东西

scanf( "%d %s", &uid, answers );

只需计算您能够成功从标准输入解析数据的次数,然后调用您的 lineNumber 计数(如果您甚至需要知道总行数)。

于 2013-03-27T22:16:01.693 回答
0

有多种方法可以做到这一点。我会推荐一个使用结构的链表,并记录到目前为止已阅读的内容。

如果你真的想继续使用数组,请先使用 malloc 分配数组,然后使用 realloc 重新分配数组。您将对重新分配的数组大小进行计数。

它应该是这样的:

POINTER *array = realloc(orig_array_pt, size);
if (array  == NULL)
{
    // realloc failed
}
else
{
    orig_array_pt = array;
}
于 2013-03-27T22:02:52.133 回答
0

只要输入是实际文件(而不是终端或其他设备),您就可以使用rewind(stdin);将 FILE 指针设置回文件的开头...

于 2013-03-27T22:05:49.637 回答