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]);
但是数组stuNames
和grades
必须在读完numStus
和numGrades
之后才初始化,例如:
...
fscanf(inputFile,"%d",&numStus);
char stuNames[numStus][10];
fscanf(inputFile,"%d",&numGrades);
int grades[numGrades][numStus];
...
这个技巧在 ANSI C 中是不允许的。在那种情况下应该使用动态内存分配。
我正在将 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]);
但是数组stuNames
和grades
必须在读完numStus
和numGrades
之后才初始化,例如:
...
fscanf(inputFile,"%d",&numStus);
char stuNames[numStus][10];
fscanf(inputFile,"%d",&numGrades);
int grades[numGrades][numStus];
...
这个技巧在 ANSI C 中是不允许的。在那种情况下应该使用动态内存分配。