使用scanf将csv文件读取到C中的结构中

时间:2018-08-25 06:19:43

标签: c csv struct scanf binary-search-tree

我在从csv数据文件读入C语言中的二进制搜索树的节点时遇到问题。似乎没有任何数据实际被读入结构中。我现在使用的代码只是试图从csv文件中读取一行数据,然后才能进行扩展以读取整个内容,但是即使如此,我也没有得到结果。我知道此代码中可能存在很多大问题,因为我对这种语言不是很能干,但是任何见解都将不胜感激。

typedef struct{
  struct bst_t *left;
  struct bst_t *right;
  data_t data;
} bst_t;

这是我的阅读功能

void readdata(bst_t node){
  while(
  scanf("%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],
   %[^,],%[^,],%[^,],%[^,] ,[^,],%[^,],%[^,] ... ) == 14);
}

这是我的打印功能

void printdata(bst_t node){
  printf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s \n"...);
}

但是我的输出很简单:

-bash-4.1$ print

,,,,,,,,,,.,(@,,▒

我还要面对的另一个附加问题是文件中的某些数据在条目中将包含逗号,我将如何“忽略”这些逗号,使它们在文件中作为数据而不是分隔符出现?

再次感谢您。

编辑:这是我调用函数的地方:(即main)

int main(int argc, char *argv[]) {
bst_t node;
readdata(*node);
printdata(node);
return 0;

}

新的编译器代码

print.c: In function 'main':
print.c:37: error: invalid type argument of 'unary *' (have 'bst_t')
print.c: In function 'readdata':
print.c:56: error: request for member 'node' in something not a structure     or union

这是完整的代码:

#include <stdlib.h>
#include <stdio.h>


#define MAXSTRING 128


typedef struct{
  struct bst_t *left;
  struct bst_t *right;
  struct data_t data;
} bst_t;

void readdata(bst_t *node);
void printdata(bst_t node);

int main(int argc, char *argv[]) {
    bst_t node;
    readdata(&node);
    printdata(node);
    return 0;
}


void readdata(bst_t *node){
  while(
  scanf("%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,] \n",...) == 14)

}

1 个答案:

答案 0 :(得分:3)

read函数仅更新它通过值作为参数接收的局部变量node。您必须将指针传递给新分配的结构:

void readdata(bst_t *node) {
    while (scanf(" %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],[^,],%[^,],%[^,]",
                 node->data.ID, node->data.name, node->data.sex,
                 node->data.height, node->data.weight, node->data.team,
                 node->data.NOC, node->data.games, node->data.year,
                 node->data.season, node->data.city, node->data.sport,
                 node->data.event, node->data.medal) == 14) {
        continue;
    }
} 

您可以从main调用此函数:

int main(int argc, char *argv[]) {
    bst_t node;
    readdata(&node);
    printdata(node);
    return 0;
}

但是请注意,此功能不安全:它不能防止缓冲区溢出。

还请注意,它不能处理空字段,也不能处理带有嵌入式逗号的字段。

要正确解析输入,您需要一个处理特殊情况并提供精确错误报告的手动编码解析器。

编辑:您发布的源代码存在语法错误:

               node->data.event->node.data.medal) == 14)

它应显示为:

               node->data.event, node->data.medal) == 14)
        continue;

您应该通过将语句缩进4个空格,并在二进制运算符的,之后插入空格,使代码的格式更加可读。

尝试使用此版本的readdata :(从网页复制并粘贴)

void readdata(bst_t *node) {
    while (scanf(" %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],[^,],%[^,],%[^,]",
                 node->data.ID, node->data.name, node->data.sex,
                 node->data.height, node->data.weight, node->data.team,
                 node->data.NOC, node->data.games, node->data.year,
                 node->data.season, node->data.city, node->data.sport,
                 node->data.event, node->data.medal) == 14) {
        continue;
    }
}