【问题标题】:Error when parsing line of CSV text解析 CSV 文本行时出错
【发布时间】:2015-12-20 22:27:43
【问题描述】:

我无法在 C 中解析 CSV 文件。我需要使用该文件中的数据归档一个结构。这是我的结构的相关部分:

typedef struct Info {
    /* Some strings, integers, etc. */
    char correct; /* This is the value I can't set */
    short int status;
} t_info;

我文件中的一行看起来像这样 xxxxxx;xxxxxxx;xxxxxxx;D;254(D 是我的问题,见下文)。

    char line[1024]; /* Buffer */
    t_info info;

    fgets(line, sizeof(line), fp);

    strcpy(info.xxxxxx, getLine(line, 1)); /* Works */
    strcpy(info.xxxxxx, getLine(line, 2)); /* Works */
    strcpy(info.xxxxxx, getLine(line, 3)); /* Works */
    strcpy(info.correct, getLine(line, 4)); /* Crashs! */

getLine() 函数取自this 帖子:

const char *getLine(char *line, int num)
{
    const char *tok, *tmp = strdup(line);

    for (tok = strtok(tmp, ";"); tok && *tok; tok = strtok(NULL, ";\n"))
    {
        if (!--num)
            return tok;
    }

    return NULL;
}

我的问题是什么?

【问题讨论】:

  • 没有深入研究过这个——如果你把D换成DD会怎样。它有效吗?也许它失败了一个字符;一些边缘情况。
  • 不,不会改变任何东西。
  • 你的解决方案很草率:strdup()分配的内存无法释放,因为无法从getLine()返回的指针中计算出分配块的起始地址。此外,您不会在文件末尾测试getLine() 失败,甚至fgets() 失败:缺少字段的行将导致未定义的行为。事实上,具有长字段的行也会导致未定义的行为。需要更多的工作!
  • 感谢您的意见 :) 会调查的。

标签: c csv ansi-c


【解决方案1】:

无法使用strcpy() 保存到char。

typedef struct Info {
    char correct; /* This is the value I can't set */
} t_info;

strcpy(info.correct, getLine(line, 4)); /* Crashs! */

使用

info.correct = *getLine(line, 4);

您的编译器应该已经对此发出警告。查看编译器设置。

【讨论】:

  • 有趣,没有警告,您的解决方案也不起作用。调试时,返回值实际上是 'D',但不知何故 strcpy 操作失败。
  • @LuMa const char *getLine(char *line, int num) 的返回值不能是'D'。 'D' 是整数/字符。 getLine() 返回一个指针。无论如何,这与getLine() 返回的内容无关。这是关于strcpy() 的目的地。 info.correct 只能容纳 char。 strcpy() 需要一个指向数组的指针,其中存储许多 char。
  • @LuMa Unclear 是“您的解决方案也不起作用”。和“不知何故 strcpy 操作失败”作为答案应该使用info.correct = *getLine(line, 4); 而不是 strcpy(info.correct, getLine(line, 4));
  • 是的,对不起。你说的对。我想说的是,函数不返回NULL,它实际上是返回一个“有效”的值/指针。
  • 谢谢!你拯救了我的一天。我只是厌倦了正确阅读您的答案:)再次感谢!
【解决方案2】:

解决此问题的最简单方法是获取该行的第一个字符,并将其用于 char。

info.correct = getLine(line, 4)[0];

也许 sscanf 可能更适合您的应用程序 (guide here) 或 (similar answer)。

【讨论】:

  • 嗨,它不起作用:/ 但我会看看 sscanf。我尝试了 fscanf 但失败了,因为我读取了一个包含空格的字符串,这导致我的 fscanf 尝试失败。
  • 没有。该函数的返回值实际上是“D”,但不知何故 strcpy 函数失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多