Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中从文件扫描到数组_C - Fatal编程技术网

C语言中从文件扫描到数组

C语言中从文件扫描到数组,c,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 下面是我如何尝试将其扫描到一个数组中,但

试图从文件扫描到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]);
    }
}  
文件*employeesTXT;
int-empID[100];
char lastName[100];
charfirstname[100];
国际支付集团[100];
工作两小时[100];
employeesTXT=fopen(“employees.txt”,“r”);
if(employeesTXT==NULL)
{
printf(“错误:无法打开文件。\n”);
}否则{
而(fscanf(employeesTXT,“%[^::::%[^:::%[^:::%d:%lf\n”、&empID[i]、lastName[i]、firstName[i]、&payGroup[i]、&hoursworksworked[i])!=EOF)
{
i++;
}
fclose(雇员文本);
numRecords=i;
对于(i=0;i

一定是这一行的东西<代码>%[^::::%[^:::::%[^:::::%d:%lf\n

字符串的参数错误:

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

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

   lastName[i]
改变

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


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

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

char lastname[员工人数][姓名的最大长度]

每个lastname[i]将是一个以null结尾的字符串

但是,这就是结构的用途

// 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.

现在可以了,但现在我得到了一个奇怪的输出。所有输出都很好,而不是
0001
0002
。。我得到了像185285158481和10585871844这样的随机数。问题是你没有正确读取数字。我已经更新了我的答案,虽然Aravind提到了它,你把它作为一个字符串来读,然后把它放在一个整数中,这是不正确的。是的,很棒,它很有效。非常感谢。还有一个小错误,如何将尾随的零存储到empID中?现在它去掉了0,只打印整数!将数字的格式字符串更改为
%04d
,这样它将使用包含前导零的4个数字进行打印。欢迎使用。。。这是一个正确的答案,你应该试着在投票前想一想。但是,它实际上不是lol,因为它不用&lastname[i]就可以正常工作。检查杰夫·梅尔卡多的回答。@eveo:公平地说,他解释了为什么它不起作用。。。只是没有提到修复会是什么。但这不是它不起作用的原因,它不起作用是因为它旁边没有[50]号。@eveo:我建议你买一本关于c的书。如果您已经有了代码,您应该阅读它。要显示代码,只需将其缩进4个空格,或者选择代码并按
{}
按钮或按
Ctrl+K
。要内联代码,请用反勾(
`
)将其包装起来。@Jeff Mercado,谢谢你的提示。很公平。这是二维数组,看起来Jeff已经帮你整理好了。很高兴见到你。
// 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.