C从文件读取输入到2d数组 - 每行可变行数

时间:2015-09-22 18:41:02

标签: c arrays scanf

我正在读取从txt文件到数组的成绩列表。它在读取用户输入时工作正常,但在从文件扫描时我无法读取每一行。学生人数多变。每名学生的成绩数量是可变的。我可以毫不费力地阅读学生人数和作业数量,但是当从文件中读取时,我无法从每个学生的每一行中提取int(成绩)。输入可以像a或b(或任何更大数量的学生/作业):

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-示例2

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

我可以将名称放入2d数组的1维(我稍后会使用第二维来打印 - 该部分没有问题)。我想把等级变成二维数组。这就是我所拥有的

#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]);
   }
}

上面的部分适用于用户输入等级。从文件中获取相同的输入时,我不确定如何将等级变为适当的尺寸。关于如何考虑换行/ CR以增加阵列的任何建议都将非常感激。感谢。

3 个答案:

答案 0 :(得分:1)

stuNames可以在嵌套循环中使用,通常用于读取单个值,因为carrige返回被作为空格跳过,例如:grades

但是,只有在阅读numStusnumGrades后才能初始化数组... fscanf(inputFile,"%d",&numStus); char stuNames[numStus][10]; fscanf(inputFile,"%d",&numGrades); int grades[numGrades][numStus]; ... ManagementObject,例如:

mySearcher.Get()

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

答案 1 :(得分:0)

你比你想象的要早得多。在声明阵列时,不能使用未初始化的变量。在您的工作示例中,您不会显示您如何分配阵列。他们是固定的大小?无论你做了什么,都可能适用于你的新计划。

答案 2 :(得分:0)

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

int foo;这样未初始化的变量具有“随机”值。 您需要初始化变量,如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

我希望这会有所帮助,如果你有任何问题可以问他们