【问题标题】:reading from txt file into dynamicly allocated从txt文件读入动态分配
【发布时间】:2015-08-05 12:15:25
【问题描述】:

我想从 txt 文件中读取一些数据并将其存储在 s_person 结构中,然后再打印出来。 文本文件结构如下:

john 43 23
steven 23 44
micheal 11 0

变量数组用于txt文件中名称旁边的那两个数字。

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

struct s_person {
    char *name;
    int *array;
};

这里我有一个构造函数,用于构造您要从文件中读取的 s_person 数量。

s_person* construct(int number){    
    s_person *person = (s_person*)malloc(sizeof(s_person) * number);
    if(person){
        person->name = (char*)malloc(sizeof(char) * 50);
        person->array = (int*)malloc(sizeof(int) * 2);
    }
    return person;
}

这里是从txt文件中读取数据的函数。如果我必须阅读多行,它似乎在第二次运行时通过 fscanf(f,"%s", osoba[i].name); 处的 while 循环中断。

 void getData(s_person *person, int number) {
        FILE *f = fopen("text.txt", "r");
        if(f == NULL){
            printf("Error\n");
            return;
        }
        int i=0, j;
        while(i < number)
        {   
            fscanf(f,"%s", person[i].name); // Break point at second loop through

            // Read numbers from txt file
            for(j=0; j<2; j++){
                fscanf(f, "%d", &person[i].array[j]);
            }
            if(feof(f)){
                break;
            }
            i++;
        }

        fclose(f);
    }

我还有打印数据的功能:

void printData(s_person *person, int number)
{
    int i, j;
    for(i=0; i<number; i++){
        printf("%s ", person[i].name);

        for(j=0; j<2;j++)
        {
            printf("%d ", person[i].array[j]);
        }
        printf("\n");   
    }
}

主要看起来像这样:

main()
{
    int number = 2;
    s_person *person = construct(number);
    getData(person, number);
    printData(person, number);
    free(person);
}

我认为我做错了 fscanf 函数,但我不知道是什么。

如果我有一行数据要读取,它会完美运行。 (int number = 1;)。但如果它必须读取多于一行,它会在第二次运行时中断 fscanf(f,"%s", osoba[i].name); 的 while 循环。

【问题讨论】:

    标签: c file-io struct dynamic-memory-allocation


    【解决方案1】:

    对于s_person 中的每个number,都需要为namearray 分配内存

    s_person* construct(int number){
        int each;
        s_person *person = (s_person*)malloc(sizeof(s_person) * number);
        if ( person) {
            for (each = 0; each < number; each++){
                person[each].name = (char*)malloc(sizeof(char) * 50);
                person[each].array = (int*)malloc(sizeof(int) * 2);
            }
        }
        return person;
    }
    

    【讨论】:

    • 谢谢。现在可以了。只是语法更改:它显示 person[each]->name 错误,但它适用于 person[each].name
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2019-12-17
    • 2012-12-17
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多