我试图从.csv
文件中读取一些整数。我不确切地知道每行中文件中有多少整数,我只知道所有csv
文件都是这样的:
1,2,3,9,6,3,4
4,5,6,7
2,3,8,9,4
我需要将每一行存储在一个数组中,但我不知道如何从文件中读取整数值,而不知道该行中有多少整数。 在我的程序中,我必须检查每一行是否只有2个元素,如果第二个元素等于我从main接收的sel值。
void fun1 (sel)
{
int aux[3];
int res;
FILE* fp;
fd=fopen("c:\\myfile.csv","r");
if(fd==NULL)
{
printf("Error");
exit(-1);
}
while(!feof(fd))
{
res=fscanf(fd,"%d,%d,%d",&aux[0],&aux[1],&aux[2]);
if(res==2&&aux[1]==sel)
{
puts("Value ok");
}
}
}
我已尝试将3 %d
放入fscanf
,因为如果该行包含超过2个元素,我确定我不需要该行,但如果该行包含超过3个元素,程序继续运行而不做任何事情。
我认为问题的出现是因为fscanf
函数在到达'\n'
时停止了,但如果我不知道有多少元素包含.csv
的每一行,我该如何修复代码? {1}}档案?
答案 0 :(得分:0)
我同意kalum。我认为你的解决方案正在走上正轨,但我会用fgets
做一些事情来绕过文件中的行:
#define MAX_LINE (256)
void function(int sel){
char line[MAX_LINE+1];
int aux[3];
int count;
fd = fopen("foo.csv","r");
while(fgets(line,MAX_LINE,fd)){
count = sscanf(line,"%d,%d,%d",aux[0],aux[1],aux[2]);
if(count == 2 && aux[1] == sel){
print("ok");
}
/* Do we need to store data here? */
}
fclose(fd);
}
现在有一些假设,比如关于MAX_LINE
的假设
和你的数组以及你的文件中可能有多少行以及你正在谈论的int类型。你需要担心什么样的白色空间?读部分线时会发生什么?
行可能有1000个前导空格,或制表符和表单供稿。整数有多大?整数是否签名? %d
在您的平台和您的号码上是否足够大...... uint8
,uint16
.....您是否必须在多个平台上开展这项工作?每个细节都可以调整解决方案。
您的问题的“硬”问题可能是您说您需要将数据存储在数组中。一旦你说问题发生了变化,因为现在你需要知道在处理之前文件中有多少行。在C中处理任意大小有点像你要么痛苦