簡體   English   中英

從.txt文件中逐行讀取未知數量的其他類型的變量

[英]Reading different kind of variables of unknown quantity from a .txt file line by line

我需要從.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),因為我需要將它們逐個傳遞給函數。

我將從定義一個Person結構開始

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

Person的數組。

#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緩沖區和人員數組,因為它們已經完成,請注意,我留下了很多細節和錯誤檢查信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM