C 将文件中的输入读入二维数组 - 每行的行数可变

C reading input from a file into 2d array - variable number of lines per row

我正在将 txt 文件中的成绩列表读入数组。它在读取用户输入时工作正常,但在从文件扫描时我无法读取每一行。学生人数是可变的。每个学生的成绩数量是可变的。我可以轻松读取学生人数和作业数量,但是当从文件中读取时,我无法从每个学生的每一行中提取 int(成绩)。输入可能类似于 a 或 b(或任何更大数量的 students/assignments):

txt-example1(包括//之后的注释是我自己的,不在txt文件中)

2  //number of students
3  //the number of grades per student (will match the number of grade rows below)
theo  alvin //the number of names will match the number of students
75 60
89 90
79 95

txt-example2

3
4
theo alvin simon 
78 85 90
85 96 76 
77 99 100
88 55 92

我可以将名称放入二维数组的一维(稍后我将使用第二维来打印 - 这部分没问题)。我想将成绩放入二维数组中。这是我的

#include<stdio.h>
#include<string.h>

int numStus;
int numGrades;

int main()
{
   FILE* inputFile;
   char stuNames[numStus][10];
   int grades[numGrades][numStus];

   inputFile = fopen("testData.txt","r"); //assume inputFile has data from Ex 1 or 2 above

   fscanf(inputFile,"%d",&numStus);

   fscanf(inputFile,"%d",&numGrades);

   int i;
   int j;

   for (i=0; i<numStus; i++)
   {
      fscanf(inputFile,"%s",&stuNames[i]);
   }

   //here is where I'm having trouble

      for(i=0;i<numGrades;i++)
   {
      for(j=0;j<numStus; j++)
      {
        //I want to use fscanf, but don't know how to account for carriage returns to iterate into next part of array
      }   
   }

}  

从用户输入中获取的有效内容:

int i;
int j;
int k;

for (i=0; i<numGrades; i++)
{
   for (j=0; j<numStus; j++)
   {
      printf("Enter grade for Assignemnt %d for ",i)

      for(k=0;k<10;k++)
      {
         printf("%c",stuNames[j][k]);
      }
      scanf("%d",&grades[i][j]);
   }
}

上面的部分非常适合用户输入成绩。当从文件中获取相同的输入时,我不确定如何将成绩设置为正确的尺寸。非常感谢任何关于如何解释 newline/CR 以增加数组的建议。谢谢

你遇到麻烦的时间比你想象的要早得多。声明数组时不能使用未初始化的变量。在您的工作示例中,您没有显示如何分配数组。它们是固定尺寸的吗?无论您在那里做什么,都可能会在您的新程序中起作用。

您首先需要阅读学生数量和成绩数量。

int foo; 这样的未初始化变量有一个 "random" 值。 您需要像 int foo = 0;.

这样初始化变量

了解这一点可以逐步分析您的代码。

int numStus; //numStus gets random value
int numGrades; //numGrades gets random value

int main()
{
   FILE* inputFile;
   char stuNames[numStus][10]; //random amount gets generated
   int grades[numGrades][numStus]; //variable gets random value
   fscanf(inputFile,"%d",&numStus); //numStus gets actual value
   fscanf(inputFile,"%d",&numGrades); //numGrades gets actual value

C 是一种按顺序处理事物的语言。 这意味着数组保持已给定的大小。

可以通过像这样切换语句来修复代码:

int numStus; //numStus gets random value
int numGrades; //numGrades gets random value

int main()
{
   FILE* inputFile;
   fscanf(inputFile,"%d",&numStus); //numStus gets actual value
   fscanf(inputFile,"%d",&numGrades); //numGrades gets actual value
   char stuNames[numStus][10]; //array of wanted size gets created
   int grades[numGrades][numStus]; //random amount gets

希望对你有帮助,有什么问题可以问他们

scanf 可以在嵌套循环中使用,通常用于读取单个值,因为 return 作为 space 被跳过,例如:fscanf(inputFile,"%d",&grades[i][j]);

但是数组stuNamesgrades必须在读完numStusnumGrades之后才初始化,例如:

...
fscanf(inputFile,"%d",&numStus);
char stuNames[numStus][10];

fscanf(inputFile,"%d",&numGrades);
int grades[numGrades][numStus];
...

这个技巧在 ANSI C 中是不允许的。在那种情况下应该使用动态内存分配。