从.txt文件中逐行读取不同数量的未知数量的变量

时间:2017-03-31 02:08:59

标签: c

我需要从.txt文件中读取一个整数,一个字符串,然后读取未知数量的整数。这应该逐行完成。

示例.txt文件:

541 Andy  76 55 84 80
841 Kevin 51 37 60 55 71 68
418 Erik 25 85 40
966 Martha  64 82 71 83 55

输出应该是:

ID:541 Name:Andy Values: [76, 55, 84, 80]
ID:841 Name:Kevin Values: [51, 37, 60, 55, 71, 68]
ID:418 Name:Erik Values: [25, 85, 40]
ID:966 Name:Martha Values: [64, 82, 71, 83, 55]

问题是,我不知道一个人有多少值。所以我的代码应该继续将新的整数添加到数组中,直到它看到行的结尾。我将不得不将这些信息传递给函数这只是简单地将这些打印到屏幕是不够的。我应该能够访问和使用它们。我无法扫描所有的.txt文件(所以不能使用fscanf),因为我需要将它们传递给函数人由人。

1 个答案:

答案 0 :(得分:0)

我首先要定义一个Person结构

struct Person {
    int id;
    char *name;
    int *nums;
    size_t nums_size;
};

和一组Person s。

#define BUFFER_SIZE 128
struct Person *persons;
int persons_index = 0;
size_t persons_size = BUFFER_SIZE;
persons = malloc(persons_size * sizeof(struct Person));

在循环中,使用fgetc一次读取一个字符,直到在类Unix系统上遇到通常为\n的换行符。请注意,您应始终检查缓冲区溢出并根据需要扩展缓冲区。

char *buffer;
int buffer_index = 0;
size_t buffer_size = BUFFER_SIZE;
buffer = malloc(buffer_size * sizeof(char));
while ((c = fgetc(file)) != EOF) {
    if (buffer_index > buffer_size - 2) {
        buffer_size *= 2;
        buffer = realloc(buffer, buffer_size);
    }

    if (c == '\n') {
        /* Tokenize here */
    } else {
        /* Store the character and null terminate the buffer */
    }
}

给定整行在缓冲区中,使用strtok对行进行标记。使用atoi转换每个字符串整数。转换后跟人名的值基本上与上面相同。

int nums_index = 0;
size_t nums_size = BUFFER_SIZE;
persons[persons_index].nums = malloc(nums_size * sizeof(int));
/* Assuming strtok has been called before for person's id and name */
while ((token = strtok(NULL, " ")) != NULL) {
    if (nums_index > nums_size - 1) {
        nums_size *= 2;
        persons[persons_index].nums = realloc(
            persons[persons_index].nums, nums_size);
    }
    persons[persons_index].nums[nums_index] = atoi(token);
    nums_index++;
}
persons[persons_index].nums_size = nums_index;

不要忘记free缓冲区和人员阵列完成后请注意,我留下了很多细节和错误检查。