[英]How do I read a .csv file and save it into a 2d array?
我对 C 编程很陌生,我已经设置了读取包含 2d 整数数组的 .csv 文件的任务,然后我需要打印它以便它显示在终端中。 该数组是一个 4 行 x 2 列整数数组,但是当我使用此代码时,我会得到一个随机数字列表。 我附上了我使用的代码和 .csv 文件数组以及它应该是什么样子。
#include <stdlib.h>
#include <stdio.h>
int main()
{
FILE *in_data = fopen("in.csv", "r");
int i;
int j;
int trIn[4][2];
if(in_data == NULL)
{
printf("error\n");
return 1;
}
for(i = 0; i < 4; i++){
for(j = 0; j < 2; j++){
char junk;
if (j != 0) fgetc(in_data);
fscanf(in_data, "%c%d%c", &junk, &trIn[i][j], &junk);
printf("%d ", trIn[i][j]);
}
fgetc(in_data);
printf("\n");
}
return 0;
}
.csv 文件数组:
0 0
0 1
1 0
1 1
.csv 文件(原始):
"0","0"
"0","1"
"1","0"
"1","1"
您可以创建一个丢弃不需要的字符的模式,如下所示:
for (i = 0; i < 4; i++)
{
for (j = 0; j < 2; j++)
{
//printf("%s", str); //print str to check if there are any weird chars
fscanf(in_data, " \"%d\",", &trIn[i][j]);
printf("%d ", trIn[i][j]);
}
printf("\n");
}
如果值后面的行中有空格,则可以检查fscanf
。 尽管在说明符之前有一个空格,就像在示例中一样,应该可以解决这个问题。
此外,您可以导出不带引号的.csv
文件,如果这是您可以控制的。
您还可以使用fgets
和sscanf
的组合来尝试更强大的方法:
char str[20];
int i = 0;
int j = 0;
//...
while (i < 4 && fgets(str, sizeof str, in_data))
{
//printf("%s", str); //print str to check if there are any weird chars
if(sscanf(str, "\"%d\",\"%d\"", &trIn[i][j], &trIn[i][j+1]) == 2)
printf("%d %d\n", trIn[i][j], trIn[i][j+1]);
i++;
}
您可以用这个替换当前循环:
for(i = 0; i < 4; i++){
for(j = 0; j < 2; j++){
char junk;
if (j != 0) fgetc(in_data);
fscanf(in_data, "%c%d%c", &junk, &trIn[i][j], &junk);
printf("%d ", trIn[i][j]);
}
fgetc(in_data);
printf("\n");
}
这是有效的,因为fscanf(in_data, "%d", &trIn[i][j])
) 从文件in_data
读取一个 int ( %d
) 到trIn[i][j]
的内存位置。 fgetc
不起作用,因为它只读取一个字符,然后将其打印为整数。
编辑:现在,对于 .csv 文件中的每个值,您将"
和\\n
字符读入垃圾变量。
逐行:
if (j != 0) fgetc(in_data);
将,
从 csv 文件读入垃圾变量(不是一行的第一个字符)。
fscanf(in_data, "%c%d%c", &junk, &trIn[i][j], &junk);
读到:
"
字符变成垃圾变量trIn[i][j]
内存位置的数字(int: %d
)。"
字符变成垃圾变量
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.