使用fscanf函数从.csv文件读取int

时间:2016-02-09 22:10:57

标签: c file csv scanf

我试图从.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}}档案?

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在您的平台和您的号码上是否足够大...... uint8uint16 .....您是否必须在多个平台上开展这项工作?每个细节都可以调整解决方案。

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

  1. 猜猜大(静态大小)并且有时会出错。
  2. 扫描文件并逐步分配内存。
  3. 扫描整个文件一次,找到要分配的数组元素的数量,再次填充数组。