在C中从文件扫描到数组

时间:2012-04-11 17:09:35

标签: c

尝试从文件扫描到C数组但我收到错误。当我使用每行只有数字的文件时,它对我有用,如:

1.2  
3.4  
5.2  

但现在我有了这个文件:

0001:Satriani:Joe:6:38.0
0002:Vai:Steve:1:44.5
0003:Morse:Steve:10:50.0
0004:Van Halen:Eddie:3:25.75
0005:Petrucci:John:8:42.25
0006:Beck:Jeff:3:62.0  

以下是我尝试将其扫描到数组中的方法,但是我遇到了分段错误!

FILE *employeesTXT;
int empID[100];
char lastName[100];
char firstName[100];
int payGroup[100];
double hoursWorked[100];

employeesTXT = fopen("employees.txt", "r");
if (employeesTXT == NULL)
{
    printf("Error: file cannot be opened.\n");
} else {
    while (fscanf(employeesTXT, "%[^:]:%[^:]:%[^:]:%d:%lf\n", &empID[i], lastName[i], firstName[i], &payGroup[i], &hoursWorked[i]) != EOF)
    {
        i++;
    }

    fclose(employeesTXT);
    numRecords = i;

    for(i = 0; i < numRecords; i++){
        printf("%d - %s - %s - %d - %.2lf\n", empID[i], lastName[i], firstName[i], payGroup[i], hoursWorked[i]);
    }
}  

它必须是这一行...... %[^:]:%[^:]:%[^:]:%d:%lf\n

4 个答案:

答案 0 :(得分:1)

字符串的参数参数错误:

fscanf(employeesTXT, "%[^:]:%[^:]:%[^:]:%d:%lf\n",
    &empID[i], lastName[i], firstName[i], &payGroup[i], &hoursWorked[i])

lastNamefirstName被声明为100 char的数组。您希望这些是字符串,因此您需要将它们定义为100个“缓冲区”的数组。

尝试将声明更改为:

char lastName[100][50]; /* 50 or whatever the max length you'd expect + 1 */
char firstName[100][50];

我认为应该就是这样。

您对empID也有不同的问题,您将值读取为字符串而不是整数。在格式中,如果输入中确实存在整数,则整数应为%d

答案 1 :(得分:0)

更改

char lastName[100];
char firstName[100];

char lastName[100][100];
char firstName[100][100];

在阅读empID[i]时,请不要使用%[^:],而是使用%d

答案 2 :(得分:0)

正如所指出的,对于名称,您将每个新员工的信息分配到一维数组中,从而覆盖以前员工的信息(第一个字符除外)。当您尝试为数组末尾附近的索引分配足够长的名称,导致它写入最后一个索引时,最终会导致错误。您可以根据名称建议使用二维数组:

char lastname[number_of_employees][maximum_length_of_name];

并且每个lastname [i]将是一个以空字符结尾的字符串。

但是,这就是为什么建造结构。

// Define it before main()
struct employee_type{
    int empID;
    char *lastname;
    char *firstname;
    int paygroup;
    double hoursworked;
}

// In main()
struct employee_type employees[100]; // Declare an array of employee_type structures.

答案 3 :(得分:-1)

您需要将地址作为fscanf的参数,这不会作为参数,因为它只是一个字符:

   lastName[i]