文件中的换行符在 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;
}
我正在读取一个 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;
}