尝试从文件扫描到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
答案 0 :(得分:1)
字符串的参数参数错误:
fscanf(employeesTXT, "%[^:]:%[^:]:%[^:]:%d:%lf\n",
&empID[i], lastName[i], firstName[i], &payGroup[i], &hoursWorked[i])
lastName
和firstName
被声明为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]