当前位置: 首页 > 知识库问答 >
问题:

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

江烨伟
2023-03-14

我正在从一个txt文件中读取一个等级列表到一个数组中。它在读取用户输入时运行良好,但在扫描文件时,我无法读取每一行。学生人数是可变的。每个学生的分数是可变的。我在阅读学生人数和作业数量方面没有问题,但在阅读文件时,我很难从每一行中提取每个学生的整数(分数)。输入可以是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-例子

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

我可以将名称放入2d数组的一维中(稍后我将使用第二维进行打印-该部分没有问题)。我想把分数放到二维数组中。这是我的

#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个答案

颜瀚漠
2023-03-14

你首先需要阅读学生人数和分数。

一个未初始化的变量,如intfoo 具有“随机”值。您需要初始化变量,如intfoo=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

我希望这能有所帮助,你有什么问题可以问他们

慕麒
2023-03-14

你比你想象的要早得多。声明数组时不能使用未初始化的变量。在工作示例中,没有显示如何分配阵列。它们是固定尺寸的吗?你在那里做的任何事情都可能在你的新项目中起作用。

黄磊
2023-03-14

scanf可以在嵌套循环中使用,通常用于读取单个值,因为回车作为空格跳过,例如:fscanf(inputFile,"%d",

但是,数组stuNamesgrades必须仅在读取numStusnumGrades后初始化,例如:

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

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

那个把戏在ANSI C中是不允许的。在这种情况下,应使用动态存储分配。

 类似资料:
  • 所以我们刚刚进行了一个小的实践考试,要求我们阅读以下格式的输入,作为非图形问题的规则。实际的算法一点也不难做到,但我和我的伙伴们都不知道如何从一开始就扫描这些输入。 前两个整数表示行数(4)和列数。(4) 因此,接下来的四行表示每行的规则(1 2 3表示第2行),接下来的四行表示每列的规则(2 2表示第4列),依此类推。 在学习C语言一个学期后,我们只处理了每行具有相同列数的数组,在这个Java模

  • rank ▲ ✰ vote url 73 347 92 445 url 把文件一行行读入数组 怎么样才能一行行的读一个文件并把每行作为一个元素存入一个数组? 我想读取文件的没一行,然后把每行加入到数组的最后.我没找到这样的方法而且我也没能在Python中找到创建字符数组的方法. with open(fname) as f: content = f.readlines() 我想你说的是[l

  • 整个项目是从一个文件中获取数据,该文件是一个文本文件,其中载有所有201个国家的名单及其按字母顺序排列的各自互联网使用率。这里有一个例子

  • 问题内容: 我想将非常大的文件读入node.js的JavaScript数组中。 因此,如果文件是这样的: 我将拥有数组: 该函数将如下所示: 因此,将其全部加载为字符串然后拆分的想法是不可接受的。 问题答案: 如果您可以将最终数据拟合到数组中,那么是否也不能像建议的那样将其拟合为字符串并进行拆分?无论如何,如果您希望一次只处理一行文件,也可以尝试如下操作: 编辑:( 作为对 phopkins的 评

  • 问题内容: 我正在尝试将csv文件“ read_ex.csv”读入数组。我在web / stackoverflow上进行了无休止的搜索,以找到一种将文件读入数组的方法。我能做的最好的事情是以流方式读取它,但是由于文件大小可变,我无法将其存储在数组中。我相信ArrayList是处理可变大小数组的方法,但是我不知道如何使用它。本质上,我希望能够在while循环结束后访问String数组“ values

  • 我正在做一个由两部分组成的任务,第一部分是创建一个由3行4列组成的数组,然后让用户输入4个数字组成第一行的第一列。因此,如果用户输入1,2,3,4,那么数组应该打印出来:(0对于任务的第二部分,为空。 到目前为止,这就是我所拥有的,但我只使用Java几天,我确信我没有清楚地看到我的错误。我真的很感谢任何帮助我做错了什么。 这是我的代码: 至于任务的第二部分,第二行和第三行需要是该列第一行输入的任何