Мне нужно правильно прочитать конец строки.Проблема с пустой областью - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть текст для ввода с функцией fscanf.Я могу прочитать некоторые строки.Но я не мог прочитать строку.Вы можете помочь?

Мой input.txt:

54,Zeynep Kucuk,62-46-59 
62,Osman Buyuk 
46,Gulay Er,25-23-32-1

Я могу прочитать первую и третью строку.Но у меня есть некоторая проблема со второй строкой, потому что ее третья позиция пуста.

Но я могу точно прочитать, если ввод будет ниже

54,Zeynep Kucuk,62-46-59 
62,Osman Buyuk,0
46,Gulay Er,25-23-32-1

0 означает, что у Османа Буюка нет друзей.

Некоторая часть моего кода ниже

int id;
char name[100];
char friends[100];
FILE *dosya = fopen("input.txt", "r");
struct node *root = NULL;
while (fscanf(dosya, "%d,%[^,],%s,%[^,],%s\n", &id, name, friends) == 3) {
    root = insertNewUser(root, id, name, friends);
}

После добавления в дерево моих данных и печати ожидаемый результат будет:

31,NAME1 SURNAME1,16-23-45-3
21,NAME2 SURNAME2
10,NAME3 SURNAME3,12-31-1-5

1 Ответ

0 голосов
/ 22 апреля 2019

Чтобы пропустить второй и четвертый элементы в строке, вы должны передать символ подавления присваивания * перед [:

fscanf(dosya, "%d,%*[^,],%s,%*[^,],%s\n", &id, name, friends)

Обратите внимание также, что %s остановится на пробелах:вы можете использовать %[^,] вместо name и %[^\n] для friend, и вам не следует читать завершающий символ новой строки с \n, который будет читать все ожидающие пробелы, но вместо %*1[\n] или %cчитать завершающий байт.Передача максимального количества символов для хранения в целевые массивы также настоятельно рекомендуется, чтобы избежать неопределенного поведения при неверном вводе.

Наконец, если вам нужно обрабатывать строки с пропущенными частями, лучше прочитать файл одинстрока с fgets() и синтаксический анализ массива с sscanf().

Вот модифицированная версия вашего фрагмента кода:

int id;
char buf[1024];
char name[100];
char friends[100];
FILE *dosya = fopen("input.txt", "r");
struct node *root = NULL;
while (fgets(buf, sizeof buf, dosya)) {
    *friends = '\0';
    int n = fscanf(dosya, "%d,%*[^,],%99[^,],%*[^,],%99[^\n]", &id, name, friends);
    if (n >= 2)
        root = insertNewUser(root, id, name, friends);
}
...