我创建了一个链接列表。将链表发送到具有读写选项的文件。我被加载功能困住了。我也是 C 语言新手 2 个月,并且是这个网站的菜鸟。
我的代码:
void load( char filename[10], struct node *np){
// creating a temporary variable for holding a record
char tmpfirstName[30];
char tmplastName[30];
char tmpPhoneNo[15];
char tmpeMail[55];
char tmpAddress[255];
int counter;
// declare a file pointer
FILE *input= fopen(filename, "r+");
//check if the file opened successfully
if (input==NULL)
perror ("Error opening file");
else{
counter=0;
// continue in reading the file till the EOF
while(!feof(input)){
strcpy(tmpfirstName," ");
fscanf(input, "%s %s %s %s %s -=", tmpfirstName, tmplastName, tmpPhoneNo, tmpeMail, tmpAddress);
if(strcmp(tmpfirstName," ")!=0){
strcpy(np->[counter].firstName, tmpfirstName);
strcpy(np->[counter].lastName, tmplastName);
strcpy(np->[counter].phoneNo, tmpPhoneNo);
strcpy(np->[counter].eMail, tmpeMail);
strcpy(np->[counter].address, tmpAddress);
counter++;
}
}
fclose(input);
}
我遇到的错误:
C:\Users\User\Documents\Pelles C Projects\FinalProject\PhoneBook.c(134): error #2047: Expected a field name.
C:\Users\User\Documents\Pelles C Projects\FinalProject\PhoneBook.c(135): error #2047: Expected a field name.
C:\Users\User\Documents\Pelles C Projects\FinalProject\PhoneBook.c(136): error #2047: Expected a field name.
C:\Users\User\Documents\Pelles C Projects\FinalProject\PhoneBook.c(137): error #2047: Expected a field name.
C:\Users\User\Documents\Pelles C Projects\FinalProject\PhoneBook.c(138): error #2047: Expected a field name.
最佳答案
您尚未识别第 134-138 行,但该范围可能包括该行
strcpy(np->[counter].firstName, tmpfirstName);
如第 134 行。符号 np->[counter].firstName
是错误的。给定函数参数列表中的声明,您需要 np[counter].firstName
。
请注意 while (!feof(file))
is always wrong .
您应该直接测试 I/O 操作,例如使用:
while (fscanf(input, "%29s %29s %14s %54s %254s -=", tmpfirstName, tmplastName,
tmpPhoneNo, tmpeMail, tmpAddress) == 5)
{
strcpy(np[counter].firstName, tmpfirstName);
strcpy(np[counter].lastName, tmplastName);
strcpy(np[counter].phoneNo, tmpPhoneNo);
strcpy(np[counter].eMail, tmpeMail);
strcpy(np[counter].address, tmpAddress);
counter++;
}
这些数字可以防止数据溢出字符数组。
请注意,大多数地址中都有空格,使用 %s
(有或没有大小限制)扫描字符串将跳过前导空格,收集变量中的非空格,但在第一个空白。您可能需要使用扫描集:例如 %254[^=]
。无论是原始代码还是修改后的代码,您都永远不会知道格式字符串末尾的 -=
是否匹配。
我注意到您最终需要升级该函数,以便您告诉它数组有多大,这样它就不会溢出数组的边界。您可以在将数据复制到 np
数组之前添加检查。
您可能还应该升级该函数,以便它返回成功/失败指示,以及可能指示已将多少记录读入数组的机制。一种常见的方法可能是让函数返回一个整数,使用 EOF(负数,通常为 -1)来指示问题,使用零或正数来指示成功读取了多少条记录。
关于c - 加载链接列表文件指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29271895/