为啥 sscanf() 不将 CSV 文件中的行读入数组?

Posted

技术标签:

【中文标题】为啥 sscanf() 不将 CSV 文件中的行读入数组?【英文标题】:Why is sscanf() not reading line from CSV file into array?为什么 sscanf() 不将 CSV 文件中的行读入数组? 【发布时间】:2021-06-15 00:49:57 【问题描述】:

我正在尝试将 CSV 文件中的整数读入二维数组。

这是我的代码...

FILE* fp = fopen(argv[1], "r");
int counter = 0;
char line[50];
while (fgets(line, 50, fp)) 
    counter++;

int arry[counter - 1][4];
NUM_ROWS = counter -1;
counter = 0;

//Iterate File Again to Populate 2D Array of PID, Arrival Time, Burst Time, Priority
//File in Format: #,#,#,# 
rewind(fp);
//Skip First Line of Var Names
fgets(line, 50, fp);
while(fgets(line, 50, fp)) 
    sscanf(line, "%d%d%d%d", &arry[counter][0], &arry[counter][1], &arry[counter][2], &arry[counter][3]);
    counter++;

但是,sscanf() 并未将行读入数组。我不确定为什么这不起作用

编辑:Here is a picture of the file.

【问题讨论】:

您是否尝试过在调试器中逐行运行代码,同时监控所有变量的值,以确定您的程序在哪个点停止按预期运行?特别是,您是否在调用sscanf 函数之前检查了line 数组的内容?如果您没有尝试过,那么您可能想阅读以下内容:What is a debugger and how can it help me diagnose problems? 您可能还想阅读以下内容:How to debug small programs?。 “CSV”中的“C”是“逗号”。您在哪里处理代码中的逗号? 你检查sscanf函数调用的返回值了吗? 格式字符串应为%d,%d,%d,%d 以跳过逗号。 @AndreasWenzel 感谢您的回复。我现在很困惑。我检查了 gdb 中 line 的值,它读取为... ""\"3,\t1,\t3,\t2\"\r\n\000val Time\tBurst Time\tPriority \"\r\ n\000\000\034”。但是,打印之前的行会将其呈现为“3, 1, 3, 2” 【参考方案1】:
    您需要具有反映扫描行格式的scanf 格式字符串。 始终检查scanf 的结果

例子:

int main(void)

    char line[] = "34543,78765,34566,35456";
    int arry[1][4];
    int counter = 0;

    int result = sscanf(line, "%d,%d,%d,%d", &arry[counter][0], &arry[counter][1], &arry[counter][2], &arry[counter][3]);
    
    printf("result = %d\n", result);
    printf("CSV line = `%s`\n", line);
    printf("data read: %d, %d, %d, %d\n", arry[counter][0], arry[counter][1], arry[counter][2], arry[counter][3]);
  

https://godbolt.org/z/zs5Y8ff8h

【讨论】:

以上是关于为啥 sscanf() 不将 CSV 文件中的行读入数组?的主要内容,如果未能解决你的问题,请参考以下文章

随机无限线程和各种错误,同时并行逐行读/写

Pyspark 的 sqlContext.read.csv() 函数读取的行数比实际 .csv 文件中的行数多

从R中的csv文件中删除多余的行,然后合并csv文件

PowerShell:如何计算 csv 文件中的行数?

为啥'while(csv.Read())' 在 CsvHelper 中不能工作两到三遍?

如何更新 CSV 文件中的行