Новая строка из файла читается как char в программе c - PullRequest
0 голосов
/ 26 августа 2018

Я читаю для файла CSV, поэтому каждый элемент разделен запятыми. Я использую символ запятой в качестве разделителя, за исключением последнего элемента, для которого я использую символ новой строки. Проблема в том, что символ новой строки теперь читается в первый элемент следующего узла.

fscanf(file,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],% 
[^,],%[^,],%[^,],%[^,],%[^\n]",
                            newnode->id,
                            newnode->name,
                            newnode->sex,
                            newnode->age,
                            newnode->height,
                            newnode->weight,
                            newnode->team,
                            newnode->noc,
                            newnode->games,
                            newnode->year,
                            newnode->season,
                            newnode->city,
                            newnode->sport,
                            newnode->event,
                            newnode->medal);

Так что с первым узлом все будет в порядке, но секундами будет его идентификатор:

ID: \ n249655

например.

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Я предлагаю вам использовать комбинацию fgets + sscanf.fgets читает строку в буфер, а sscanf будет анализировать эту строку.Это позволит избежать уязвимости переполнения буфера в вашем коде, а также исправит вашу ошибку.

Вот полный пример, который читает 3 целых числа, разделенных запятыми из стандартного ввода.

#include <stdio.h>

static char buffer[BUFSIZ];

int main(int argc, char **argv)
{
    int a,b,c;
    while (fgets(buffer, BUFSIZ, stdin) != NULL) {
        sscanf(buffer, "%d,%d,%d", &a, &b, &c);
        printf("%d, %d, %d\n", a, b, c);
    }
    return 0;
}
0 голосов
/ 26 августа 2018

Я бы не использовал библиотечные функции, такие как fscanf, для чтения CSV-файлов, поскольку простое разделение запятыми не учитывает строки в кавычках с запятыми внутри.Если вы знаете, что работаете только с CSV-файлами, в которых нет строк в кавычках, тогда это хорошо.

Если вы добавляете строку формата к scanf функциям семейства с пробелом, то с любым пробеломсимволы в начале ввода игнорируются:

" %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^\n]"
...