加载链表文件指针

时间:2015-03-26 05:50:49

标签: c

我创建了一个链表。将链接列表发送到具有写入和读取选项的文件。我坚持使用加载功能。我也是2个月新来的C和这个网站的菜鸟。

我的代码:

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.

3 个答案:

答案 0 :(得分: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++;

答案 1 :(得分:0)

您尚未识别第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)表示问题,使用零或正数表示成功读取了多少条记录。

答案 2 :(得分:0)

另请注意,这不是链接列表的工作方式。从文件中读取后,您需要创建一个节点,将数据放入节点,然后将其链接到前一个处理程序。以下是一个简短的想法...

假设你有

struct node *temp;

之前声明,你需要重新创建循环中的所有内容

temp = (struct node*)malloc( sizeof( struct node ) );
strcpy(temp->firstName, tmpfirstName );
/* copy the rest of the stuff here */
temp->next = NULL;

if (np == NULL) np = temp;
else  {
    np -> next = temp;
    np = np -> next;
}