为啥 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 文件中的行数多