Чтение столбцов строк и целых чисел из файла - PullRequest
0 голосов
/ 11 декабря 2018

Я могу читать символы, слова, предложения и целые числа из отдельных файлов, но я пытаюсь прочитать слова и целые числа из файла того же .Допустим, мой файл содержит следующее:

Patrice 95
Rio 96
Marcus 78
Wayne 69
Alex 67
Chris 100
Nemanja 78

Мое частичное решение (для чтения в строках) до сих пор заключалось в использовании fgetc() и проверке пробелов и / или возврата каретки в моем текстовом файле для разделения именииз числа.

Основная проблема с fgetc заключается в том, что он читает символ за символом, и поэтому целые числа не предназначены для чтения таким образом.В качестве обходного пути я преобразовываю символ в целое число всякий раз, когда число читается.

Это основная структура кода:

typedef struct person {
    char name[10][10];
    char surname[10][10];
    int age [10];
} person_t;

FILE *inp; /* pointer to input file */
char c;
int word_count = 0;
int char_count = 0;
int i = 0;
int x;
person_t my_person;

while ((c = fgetc(inp)) != EOF) {
        if (c == ' ' || c == '\r') {
            printf("\n");

            my_person.name[word_count][char_count] = '\0'; //Terminate the string
            char_count = 0; //Reset the counter.
            word_count++;
        }
        else {

            if (c >= '0' && c <= '9') {
                x = c - '0'; //converting to int
                my_person.age[i] = x;
                printf("%d", my_person.age[i]);
                i++;
            }
            else {
                my_person.name[word_count][char_count] = c; 
                printf("%c",my_person.name[word_count][char_count]);

                if (char_count < 19) {
                    char_count++;
                }
                else {
                    char_count = 0;
                }
            }
        }   
    }
}


for (int i = 0; i<7; i++) {
    printf("ages: %d \n",my_person.age[i] );  //never executes
}

Пример вывода:

Patrice
95

Rio
96

Marcus
78

Wayne
69

Alex
67

Chris

Полный код можно найти на pastebin .

Почему цикл for никогда не выполняется?Любые предложения о том, что я могу улучшить, чтобы прочитать столбцы строк и целых чисел?

1 Ответ

0 голосов
/ 11 декабря 2018

Используйте fgets() для чтения всей строки.

char line[100];
while (fgets(line, sizeof line, inp)) {
    // got a line, need to isolate parts
}

Затем, в зависимости от того, могут ли слова иметь встроенные пробелы, выберите одну из следующих стратегий.

a) sscanf() чтобы выделить имя и возраст

while (fgets(line, sizeof line, inp)) {
    char name[30];
    int age;
    if (sscanf(line, "%29s%d", name, &age) != 2) /* error, bad line */;
    // ...
}

b) strrchr(), чтобы найти последний пробел, затем строковые манипуляции для извлечения имени и возраста.

while (fgets(line, sizeof line, inp)) {
    char name[30];
    int age;
    char *space = strrchr(line, ' ');
    if (!space) /* error, bad line */;
    if (space - line >= 30) /* error, name too long */;
    sprintf(name, "%.*s", space - line, line);
    age = strtol(space, NULL, 10); // needs error checking
    // ...
}

стратегия b) на https://ideone.com/ZOLie9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...