只是一个先声夺人我仍然是整个编程中的菜鸟,我有一个基本的水平。 因此,我正在编写此代码以从文本文件中读取数据并将其显示在黑屏上。
我从这开始,但由于某种原因它不起作用!有人能帮我吗?
另外一件事,如果我想写这个城市和候选人的名字就像这张照片我怎么可能,因为它是一个只接受整数的数组?
答案 0 :(得分:7)
如果您正确缩进代码,您将能够更轻松地查看问题。
for (i=0; i<5; i++){
for (j=0; j<4; j++)
fscanf(inp,"%d",&arr[i][j]); // This ends the second for loop.
// Then you are closing the file after one
// run of the first loop.
fclose (inp);
}
你需要:
for (i=0; i<5; i++){
for (j=0; j<4; j++)
fscanf(inp,"%d",&arr[i][j]);
}
// Move it out of the loops.
fclose (inp);
为了避免这样的问题,最好总是使用{}
来限制循环,即使对于一个衬里也是如此。
for (i=0; i<5; i++){
for (j=0; j<4; j++) {
fscanf(inp,"%d",&arr[i][j]);
}
}
其他问题
您需要添加代码才能跳过第一行。它没有相同格式的数据。
添加功能
void skipLine(FILE* in)
{
int c;
while ( (c = fgetc(in)) != EOF && c != '\n');
}
并在阅读数据之前使用它。
skipLine(inp);
您需要添加代码以从每行读取名称。
为name
char name[200]; // Make it large enough
并确保为每一行读取它。
for (i=0; i<5; i++)
{
// Make sure to limit the number of characters being read.
fscanf(inp, "%199s", name);
for (j=0; j<4; j++)
{
fscanf(inp,"%d",&arr[i][j]);
}
}
使用索引i
和j
是不对的。
int a[4][5];
i
的有效值范围必须为0-3
,而j
的有效值范围必须为0-4
。鉴于您需要的是5行数据:
int a[5][4];
检查fscanf
作为一种良好做法,请务必检查fscanf
的返回值。这将允许您捕获错误并帮助您解决从磁盘读取的问题。
将读取数据的代码更改为:
for (i=0; i<5; i++)
{
if ( fscanf(inp, "%199s", name) != 1 )
{
fprintf(stderr, "Unable to read the name\n");
exit(EXIT_FAILURE);
}
for (j=0; j<4; j++)
{
if ( fscanf(inp,"%d",&arr[i][j]) != 1 )
{
fprintf(stderr, "Unable to read the number from %d-th row and %d-th column\n", i, j);
exit(EXIT_FAILURE);
}
}
}