【问题标题】:reading in a large amount of lines in C (csv files)在 C 中读取大量行(csv 文件)
【发布时间】:2018-03-11 16:17:17
【问题描述】:

我有一个格式如下的输入 .csv 文件:

10012,85
11981,100
10728,65

第一个数字是学生证,后面是考试成绩。我需要能够读取不定数量的这些行,但我不确定如何在 C 中读取。我无法正确格式化 fscanf(一直给我运行时错误/崩溃)。这是我的尝试(请注意,结构就是我稍后将如何使用从文件中收集的数据):

int main(int argc, char **argv) {
int i = 0;
FILE *inf;
struct List list = SLL_new();

for(int i = 1; i < argc; i++){
    inf = fopen(argv[i], "r");
    int studentID = 0;
    int grade = 0;
    if(inf == NULL){
        printf("bad");
        return 1;
    }

    fscanf(inf, "%d,%d", &studentID, &grade);
    printf("%d, %d", studentID, grade);
}

}

}

这是我在顶部使用输入文件运行时的输出(预编辑,当我使用 fread 时):

C:\Users\witcher\Documents\NJIT\CS 288>a midterm01.csv
10012,85
11981,100
10728,65δ

我认为这不适用于更多的行,无论如何,最后的特殊字符也让我感到困惑。我需要将这些值读取为整数,但如果我使用 fread,那么我需要稍后将它们转换为这些值。

【问题讨论】:

  • char buf[128]; 然后fread(buf, 256, 2, inf); 这是不安全的。
  • 可以改变一个或另一个,但我认为这不是我的问题。我不太了解第 2 和第 3 个参数,无法很好地阅读。
  • 你不应该把fopen放在循环中...只打开一次文件以避免内存泄漏
  • 为什么if(inf == NULL) 在循环中?
  • inf = fopen(argv[i], "r"); : i 未初始化。

标签: c file csv input


【解决方案1】:

您正在阅读整数,并尝试打印字符串;

fscanf(inf, "%d,%d", &studentID, &grade);
printf("%s, %s", studentID, grade);

应该是

fscanf(inf, "%d,%d", &studentID, &grade);
printf("%d, %d", studentID, grade);

要读取整个文件尝试

while (2 == fscanf(inf, "%d,%d", &studentID, &grade))
{
    printf("%d, %d", studentID, grade);
}
fclose(inf);

【讨论】:

  • 好吧,我有点傻。运行时错误消失了,但现在检查空文件流退出函数。
  • @AnthonyB 正如@BLUEPIXY 所说的inf = fopen(argv[i], "r");:i 未初始化。试试inf = fopen(argv[1], "r");
  • 我需要能够迭代无限数量的命令行参数(文件),所以第二个不起作用。我确实在 main 的开头初始化了 i,所以我不明白为什么这是一个问题。
  • @AnthonyB 你需要两个循环。一个用于 i..argc,一个用于读取文件末尾。在设置 i 之前不要使用 argv[i]
  • 如何获取文件中的行数以在 c 中迭代?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2019-11-26
相关资源
最近更新 更多