2016-02-09 180 views
0

我试图从.csv文件中读取一些整数。我不知道到底有多少整数是每行的文件中,我只知道,所有的csv文件是一样的东西:使用fscanf函数从.csv文件中读取int

1,2,3,9,6,3,4 
4,5,6,7 
2,3,8,9,4 

我需要存储阵列中的每一行,但我不”我知道如何从一个文件中读取整数值而不知道该行中有多少个整数。 在我的程序中,我必须检查每行是否只有2个元素,以及第二个元素是否等于我从主接收到的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 %dfscanf因为如果行包含超过2个元素我敢肯定,我不需要这条线,但如果该行包含超过3种元素的保留节目没有做任何事情就跑步

我认为这个问题的出现是由于fscanf功能停止时达到'\n',但如何解决,如果我不知道有多少元素包含.csv文件的每一行代码?

+0

尝试使用fgetc一次读取一个字符。当行有6或7个值时,你的计划是什么? – bruceg

+0

考虑使用['fgets'](http://linux.die.net/man/3/fgets)来阅读整行。然后使用['strtok'](http://linux.die.net/man/3/strtok)+ ['strtol'](http://linux.die.net/man/3/strtol)或[' sscanf'](http://linux.die.net/man/3/sscanf)解析出数字。 – kaylum

+0

您存储整数的数组也需要a)足够大以保存您愿意支持的线上的大多数整数,或者b)动态分配,例如,与'malloc'。 –

回答

0

我同意卡尔姆。我认为你是在正确的轨道与您的解决方案上,但我会做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足够大,在您的平台和您的号码... uint8uint16 .....你是否需要在许多平台上做这项工作?这些细节中的每一个都可能会调整解决方案。

你的问题可能是“硬”的问题是你说你需要将数据存储在一个数组中。一旦你说问题发生了变化,因为现在你需要知道文件中有多少行,然后再处理它。在C处理任意大小是有点痛,因为你要么

  1. 有时猜测大(静态大小)和错误。
  2. 扫描文件并递增分配内存。
  3. 扫描整个文件一次,找到要分配的数组元素的数量,然后再次填充数组。
+0

'aux [1] = sel'是赋值,而不是比较。 – chux