【问题标题】:how to read data from text file in struct with different number of words in lines in c programming?如何从结构中的文本文件中读取数据,在 c 编程中具有不同的行数?
【发布时间】:2016-03-16 18:37:16
【问题描述】:

我正在尝试从文本文件中读取结构中的数据,我想打印与原始文件相同的数据。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct _Member{
    char *name;
    int age;
    int id;
    char *town;
}Member;

int main() {

    FILE *file = fopen("member.txt", "r");
    FILE *newFile = fopen("new_member.txt", "w");

    int counter=0, line = 10;

    Member *member = malloc(sizeof(Member)*line);

    for(int i =0; i<line; i++){
        int len = 12;
        char *name = malloc(sizeof(char)*(len+1));
        name [len] = '\0';
        int age;
        int id;
        char *town = malloc(sizeof(char)*(len+1));
        town [len] = '\0';

        fscanf(file, "%s %i %i %s\n", name, &age, &id, town);

        member[counter].name = name;
        member[counter].age =age;
        member[counter].id = id;
        member[counter].town = town;

        counter++;
    }

    for(int i = 0; i < counter-1; i++){

        fprintf(newFile, "%s %d %d %s\n", member[i].name, member[i].age, member[i].id, member[i].town);
    }

    fclose(file);
    fclose(newFile);

    printf("Successful\n");

    return 0;
}

会员.txt

John 23 3456 Edinburgh
Robert 33 4567 London
Peter 45 4345 
Cary 56 12345 
Dian 45 4587 Norfolk
Will 32 3453 Essex
Paul 56 7896 York
Alisha 78 1234 Peterbourgh
Brandon 45 3214 Brighton
Eli 39 5234 Oxford

我得到了结果。 新成员.txt

John 23 3456 Edinburgh
Robert 33 4567 London
Peter 45 4345 Cary
56 12345 4345 
Dian 45 4587 Norfolk
Will 32 3453 Essex
Paul 56 7896 York
Alisha 78 1234 Peterbourgh
Brandon 45 3214 Brighton

如何打印与原始文件相同的内容?请注意;我正在尝试读取 STRUCT 中的数据。我的结构正在阅读第三行并从第四行取名作为城镇。任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: c struct linked-list


    【解决方案1】:

    您还没有为少数情况定义城镇名称,例如

    Peter 45 4345 
    Cary 56 12345
    

    但是当您尝试通过fscanf 阅读它时,编译器预计会出现城镇名称;

    fscanf(file, "%s %i %i %s\n", name, &age, &id, town);
    

    此数据将从下一行获取,依此类推。

    如果是这种情况,那么您可以改用fgetssscanf

    希望这会有所帮助。

    【讨论】:

    • 感谢@Sudipta Kumar Sahoo。我按照你的建议试过了。但是,fgets、sscanf 不会读取 struct 中的文件。
    【解决方案2】:

    这有效,但前提是城镇的单词不包含在文本的一行中。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _Member{
        char *name;
        int age;
        int id;
        char *town;
    }Member;
    
    int main() {
    
    FILE *file = fopen("member.txt", "r");
    FILE *newFile = fopen("new_member.txt", "w");
    char* lines;
    lines = (char *)malloc(40*sizeof(char));
    int counter=0, line = 10;
    int i;
    Member *member = malloc(sizeof(Member)*line);
    
    for(i=0; i<line; i++){
        int age;
        int id;
        while(fgets(lines, 40, file)!=NULL){
    
            char *name = (char *)malloc(13*sizeof(char));
            char *town = (char *)malloc(13*sizeof(char));
            if(sscanf(lines, "%s %i %i %s", name, &age, &id, town)==4){
                member[counter].name = name;
                member[counter].age =age;
                member[counter].id = id;
                member[counter].town = town;
                counter++;
            }
            else{
                member[counter].name = name;
                member[counter].age =age;
                member[counter].id = id;
                member[counter].town = "\0";
                counter++;
            }
        }
    }
    
    for(i= 0; i < counter; i++){
    
        fprintf(newFile, "%s %d %d %s\n", member[i].name, member[i].age, member[i].id, member[i].town);
    }
    
    fclose(file);
    fclose(newFile);
    
    printf("Successful\n");
    
    return 0;
    

    }

    如果你愿意,你可以改变这个:

                else{
                member[counter].name = name;
                member[counter].age =age;
                member[counter].id = id;
                member[counter].town = "\0";
                counter++;
                }
    

    到这里:

                else{
                printf("The line of %s is not valid", name);
                }
    

    因此您的新文本将仅包含有效行。

    【讨论】:

    • 您的代码的问题是您逐字读取文件,当您的程序没有要读取的城镇时,它会读取下一个单词,即下一个名称。您应该首先将文件拆分为行,然后分别操作每一行。
    • @MHR 您愿意回复我们的任何答案吗?
    • 谢谢@George Bou。我正在尝试按原样读取 struct 中的 member.txt 文件,以便我可以重新排列文件。如果第三行和第四行有城镇名称,或者所有行的字数相同,我的代码就可以工作。谢谢你的负担。我不知道该怎么做,或者我的方式是否可能。 :(
    • 顺便说一句,我很关心并且感谢大家的回答。谢谢(y)@George Bou
    【解决方案3】:

    尝试使用 getline()、strtok()、atoi() 获取数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      相关资源
      最近更新 更多