如何使用strtok()从文本文件中读取并创建结构?

时间:2014-03-17 23:06:31

标签: c arrays file struct linked-list

给定一个文本文件:

I Angelina Jolie 1 7728323
I Mel Gibson 3 7809606 7733889 7724609
I Robert Redford 2 7721170 7731959
I Jennifer Aniston 4 2188989 2189898 2181020 2183456
I Jami Gertz 4 7734404 7774012 7773023 7921492
I Brad Pitt 2 7774017 7878485
R Sylvester Stallone 0 
I Victoria Principal 3 7933045 7771234 7820987
R Jennifer Aniston 0
R Sean Penn 0
I Kevin Costner 1 7874014
Q

我需要读取每一行,用空格分隔值,并创建每一行的结构。我目前的代码是:

int main(){
int y;
FILE *data;
char action;
char line[100];
int counter = 0;
int index = 0;

struct number{
    int phoneNumber;
    struct number *next;
};

struct contact{
    char fName[10];
    char lName[10];
    struct number *start;
};  

struct number numbers[50];
struct contact directory[10];

if((data=fopen("hw6data.txt", "r")) != NULL){
    while(fscanf(data, "%s", line) != EOF){
        char s[2] = " ";
        char *token;

        token = strtok(line, s);

        while(token != NULL){
            if(counter==0){
                if(s == "I") {
                    if(counter==1){
                        strcpy(directory[index].fName, s);
                    }
                    if(counter==2){
                        strcpy(directory[index].lName, s);
                    }
                }
            }
            token = strtok(NULL, s);
        }
    }
}

for(y = 0; y < 10; y++){
    printf("%s ", directory[y].fName);
    printf("%s\n", directory[y].lName);
}

fclose(data);
return 1;

}

我正在尝试为每个手机联系人创建一个结构。 I或R表示是否应插入触点或将其移除。该目录是一个包含最多10个联系人的数组。我总共可以容纳50个号码。每个联系人结构都包含一个指针,该指针应指向数字结构的数字数组中的第一个数字。我正在创建一个基于数组的链表。我认为这段代码应该创建联系结构。它编译,但当我运行它时,我得到:

 ��f
 �
ɷ� 
�E 

����� 
 �
�� 
.N=� 
 |�X�|���^�
� 
Segmentation fault

帮助?

2 个答案:

答案 0 :(得分:1)

解析&#34; I&#34;线条和印刷的内容:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
    int y;
    FILE *data;
    char action;
    char line[100];
    int counter = 0;
    int index = 0;


    struct contact{
    char fName[10];
    char lName[10];
    };  

    struct contact directory[10];

    if((data=fopen("hw6data.txt", "r")) != NULL){
        while(fgets(line,sizeof(line),data)){
            char s[2] = " ";
            char *token = strtok(line, s);

            while(token != NULL) {
                if(strcmp(token,"I")==0) {
                    counter = 0;
                }
                if(counter==1) {
                    strcpy(directory[index].fName, token);
                }
                if(counter==2) {
                    strcpy(directory[index].lName, token);
                    index++;
                }
                counter++;
                token = strtok(NULL, s);
            }
        }
    }

    for(y = 0; y < index; y++){
        printf("%s ", directory[y].fName);
        printf("%s\n", directory[y].lName);
    }

    fclose(data);
    return 1;
}

如果有帮助......

答案 1 :(得分:0)

我可以一目了然地看到一些问题(不一定是完整的清单):

  • while (fscanf(data, "%s", line) != EOF)一次不读取整行(这似乎是您的意图,因为您将变量命名为line)。您可能希望改为while (fgets(data, 100, line) != NULL)
  • 您无法在C中进行字符串比较if (s == "I")。如果您只是检查第一个字符,则可以执行if (s[0] == 'I')(请注意,此处使用单引号('')表示字符文字,而双引号("")用于表示字符串文字。
  • if (counter == 1)if (counter == 2)嵌套在if (counter == 0)内,因此这些条件永远不会成立,除非您在counter之后的某个时间点修改if (counter == 0)if (counter == 1)之前。
  • counterindex永远不会增加,因此整个while循环对directory数组没有任何影响。这就是为什么当你试图打印出它的价值时你会得到垃圾。