C 将数据从文件读入2个数组

C 将数据从文件读入2个数组,c,ubuntu,C,Ubuntu,我试图从文件中读取数据文件设置如下: 3050 76 2030 60 1600 70 2222 50 2430 60 2800 50 0 0 第一个数字表示学生ID,第二个数字表示学生的年级 当程序达到0时,它应该停止读取文件 下面是一个程序示例,它没有从文件中读取,因为出现了一个称为分段错误的错误。我使用的是ubuntu,这是一个错误 // this is the grading sorting program for part one #include <stdio.h>

我试图从文件中读取数据文件设置如下:

3050 76
2030 60
1600 70
2222 50
2430 60
2800 50
0 0
第一个数字表示学生ID,第二个数字表示学生的年级 当程序达到0时,它应该停止读取文件

下面是一个程序示例,它没有从文件中读取,因为出现了一个称为分段错误的错误。我使用的是ubuntu,这是一个错误

// this is the grading sorting program for part one


#include <stdio.h>
#include <stdlib.h>

#define SIZE 50

int main(int argc, char **argv)
{
    FILE* fp; // file pointer, points to the file
    char file_name[32]; // store file name

    int ID[SIZE];
    int grade[SIZE];

    int a,b; // index variables

    int student_id, grades;

    // opening file by asking the user for the file name
    printf("Enter the name of the file containing the grades\n");
    scanf("%s",file_name);

    fp=fopen("file_name", "r");

    /*fp = fopen("grades.txt", "r");*/

    // read in data into the arrays
    for (a = 0; a <= SIZE; a++)
    {
        fscanf(fp,"%d", &student_id);
        ID[a] = student_id;

        for(b = 0; b <= SIZE; b++)
        {
            fscanf(fp,"%d", &grades);
            grade[b] = grades;
        }

        if(ID[a] == 0 && grade[b] == 0)
            break;
    }

    fclose(fp);
    return 0;
}

一个提示,您正在读取多个值。您有一个嵌套的for循环,该循环将尝试读取大小*大小的实体

您的问题可能是这一部分:

fp=fopen("file_name", "r");
您想改为使用变量文件\u名称:

fp=fopen(file_name, "r");
要使程序不易出错,应始终检查文件是否已成功打开:

fp=fopen("file_name", "r");
if (!fp)
  return -1;

这并不能解决问题,但当a=0时会发生变化;a打开的文件名为file_name,可能不是从命令行扫描进来的文件

要解决此问题,请删除行上的引号

   fp=fopen("file_name", "r");

您不需要内部循环,而且您正在读取类似~/file\u name的内容,这可能不存在,因此fp将为NULL,您不检查它,因此任何尝试使用它的行为都将导致崩溃。

这听起来是一个了解gdb的绝佳机会。因为你在ubuntu上,所以默认情况下应该安装它

使用-gdb3编译程序并将其加载到gdb中:

gdb -q ./a.out
使用r运行它,gdb将显示segfault发生的位置,然后使用print语句检查变量

$ gdb -q a.out 
Reading symbols from /home/user/tmp/SO/bytes/a.out...done.
(gdb) r
Starting program: /home/user/tmp/SO/bytes/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x080483a4 in main () at sf.c:7
7       *p = 2;
(gdb) print p
$1 = (int *) 0x0

这里有很多问题,比如:

文件名可能不正确-fopenfile_name,。。。将始终打开名为filename的文件

您正在创建长度为50大小的ID和grade数组-在C中,这意味着数组索引的范围从0到49,但循环的a和b都从0到50

您没有对fscanf的输出进行任何健全性检查,也没有检查是否可以实际打开该文件

我建议你阅读一下C数组、字符串处理和文件I/O操作——你可以通过谷歌找到大量的教程。

首先 这是不正确的

fp=fopen("file_name", "r");
也许你是说

fp=fopen(file_name, "r");
第二 在读取大小时间的整数之前,不能退出此循环

for(b = 0; b < SIZE; b++)
        {
            fscanf(fp,"%d", &grades);
            grade[b] = grades;
        }
相反,你真正需要的是阅读成绩

第三 请记住始终测试来自fscanf和fopen的返回代码

例如:

if ((fp=fopen(file_name,"r"))==NULL) exit(-9);
do {
    if (fscanf(fp,"%d",&(ID[a]))!=1) break;
    if (fscanf(fp,"%d",&(grade[a]))!=1) break; 
}
while((grade[a]!=0) && (ID[a++]!=0));

这看起来像是HomeWork文件名超过32个字符?另外,如果这是作业,您应该将其标记为作业。什么意思?编译并使用-gdb3GDB运行gdb是一个命令行调试器。调试器是帮助您修复程序并允许您一次运行一行程序的工具。
if ((fp=fopen(file_name,"r"))==NULL) exit(-9);
do {
    if (fscanf(fp,"%d",&(ID[a]))!=1) break;
    if (fscanf(fp,"%d",&(grade[a]))!=1) break; 
}
while((grade[a]!=0) && (ID[a++]!=0));