文件中的换行符在 C 程序中被读取为 char

Newline from file being read as char in c program

我正在读取一个 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

例如。

我不会使用像 fscanf 这样的库函数来读取 CSV 文件,因为仅用逗号分隔并不能解释其中包含逗号的引用字符串。如果您知道您只处理没有带引号的字符串的 CSV 文件,那么您就很好了。

如果您使用 space 将格式字符串添加到 scanf 系列函数,则输入开头的任何白色 space 字符将被忽略:

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

我建议您使用 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;
}