Чтение файла .txt в C с пробелами

Я пытаюсь открыть простой текстовый файл в C, как показано ниже.

пример списка

Вводимый текст:

Name    Sex Age Dad Mom 
Gabriel M   58  George  Claire          
Louise  F   44          
Pablo   M   19  David   Maria

Я сомневаюсь, как я могу определить пробелы в списке и правильно перейти к другим строкам.

Вот мой код:

#include <stdio.h>

int main() {
    FILE *cfPtr;

    if ((cfPtr = fopen("clients.txt", "r")) == NULL) {
        puts("The file can't be open");
    } else {
        char name[20];
        char sex[4];
        int age;
        char dad[20];
        char mom[20];
        char line[300];

    printf("%-10s%-10s%-10s%-10s%-10s\n","Name","Sex","Age","Dad","Mom");
    fgets(line,300,cfPtr);
    fscanf(cfPtr,"%10s%10s%d%12s%12s",name,sex,&age,dad,mom);

    while (!feof(cfPtr)) {
        printf("%-10s%-10s%d%12s%12s\n",name,sex,age,dad,mom);
        fscanf(cfPtr,"%19s%3s%d%12s%12s",name,sex,&age,dad,mom);
    }

        fclose(cfPtr);
    }
    return 0;
 }

Он отлично работает, если я заполняю все пробелы...


person noodles1211    schedule 01.11.2018    source источник
comment
Разместите здесь образец исходного текста, чтобы внести ясность в сообщение. Изображения ссылок сложнее использовать, и ссылки исчезают.   -  person chux - Reinstate Monica    schedule 01.11.2018
comment
как я могу определить пробелы --› исследование, используя возвращаемое значение из функции fscanf() вместо feof(cfPtr). Кто или какой текст предложил while (!feof(cfPtr)) {?   -  person chux - Reinstate Monica    schedule 01.11.2018
comment
Я редактировал вводимый текст.   -  person noodles1211    schedule 04.11.2018
comment
while (!feof(cfPtr)) был примером от моего учителя, я думаю, это был не очень хороший пример. Я попробую использовать возвращаемое значение fscanf.   -  person noodles1211    schedule 04.11.2018


Ответы (1)


printf("%-10s%-10s%d%12s%12s\n",name,sex,age,dad,mom);
fscanf(cfPtr,"%19s%3s%d%12s%12s",name,sex,&age,dad,mom);

Измените порядок: сначала читайте, потом печатайте.

В идеале данные в вашем файле должны быть разделены запятой, табуляцией или другим символом. Если данные находятся в фиксированных столбцах, читайте все как текст (включая целые числа), а затем преобразуйте целое число в текст позже.

Также проверьте возвращаемое значение для fscanf, если результат не равен 5, то некоторые поля отсутствуют.

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

int main() 
{
    FILE *cfPtr = fopen("clients.txt", "r");
    if(cfPtr == NULL) 
    {
        puts("The file can't be open");
        return 0;
    }

    char name[11], sex[11], dad[11], mom[11], line[300];
    int age;

    fgets(line, sizeof(line), cfPtr); //skip the first line
    while(fgets(line, sizeof(line), cfPtr))
    {
        if(5 == sscanf(line, "%10s%10s%10d%10s%10s", name, sex, &age, dad, mom))
            printf("%s, %s, %d, %s, %s\n", name, sex, age, dad, mom);
    }

    fclose(cfPtr);
    return 0;
}

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

person Barmak Shemirani    schedule 02.11.2018
comment
@Зачем использовать %10s с char name[20]? - person chux - Reinstate Monica; 05.11.2018
comment
@chux, я изменил распределение на 11, чтобы сделать тебя счастливым. - person Barmak Shemirani; 05.11.2018