【问题标题】:Newline from file being read as char in c program文件中的换行符在c程序中被读取为char
【发布时间】:2018-08-26 02:35:45
【问题描述】:

我正在阅读一个 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 是:

ID:\n249655

例如。

【问题讨论】:

  • 为什么会令人惊讶?你从来没有读过换行符。
  • 问题是它正在读取换行符。上一行的换行符被读取为下一个节点 ID 字符串的一部分。
  • 是的,很明显。如果您想在阅读该行的其余部分时阅读换行符,您应该在格式的末尾加上 %*1[\n] 之类的东西,对吧?但你没有,所以字符仍然在那里,可以被下一个 scanf 读取。

标签: c file scanf newline delimiter


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果您将格式字符串添加到 scanf 系列函数前面带有空格,则输入开头的任何空白字符都将被忽略:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多