c - 加载链接列表文件指针

标签 c

我创建了一个链接列表。将链表发送到具有读写选项的文件。我被加载功能困住了。我也是 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/

相关文章:

c - 如何使用 xlib 获取现有窗口的显示结构

c++ - PyModule_AddObject 崩溃

我可以获得内存中已有数据支持的 FILE* 吗?

c - 段错误语言c

c - 使用 zlib 版本 1.1.3 解压缩内存中的 gzip 文件

C - 内部有 fork()/pipe() 的 WHILE 循环

c - C 中使用分隔符分割字符串

c - 在整个函数中保留 C 内存

c - 从 sqlite 中的 blob 中读取垃圾

c++ - 提示重新启动进程以获取管理权限