使用C从数组中的csv文件读取和存储值

时间:2018-08-25 06:08:27

标签: c csv

#include <stdio.h>
#include <stdlib.h>

int main() {
    int c1[100];
    char c2[150];
    char c3[100];
    float c4[100];
    float c5[100];
    float c6[100];
    float c7[100];
    char c8[100];
    char c9[100];
    float c10[100];
    char string[10][100];
    int i, j;
    char c;

    FILE *fp1;
    fp1 = fopen("sample.csv", "r");
    while (1) {
        c = fgetc(fp1);
        if (c == EOF)
            break;
        else
            printf("%c", c);
    }

    for (i = 1; i <= 10; i++) {
        fscanf(fp1, "%d,%[^,],%[^,],%[^,],%[^,],%d,%d",
               &c1[i], &c2[i], &c3[i], &c4[i], &c5[i],
               &c6[i], &c7[i], &c8[i], &c9[i], &c10[i]);
    }

    for (j = 0; j <= 10; j++) {
        printf("\n");
        printf("%d", c3); //Here i am trying to read the column3 values but getting random integer values.
        //This problem continues to every column
    }
    return 0;
}

我必须读取文件 sample.csv 并将值存储到数组中,以便可以对该值执行操作。 我没有从读取的csv文件中获取确切的值。 我在运行程序时得到一些随机整数值。

2 个答案:

答案 0 :(得分:1)

您的代码中有很多问题:

  • 您不检查fopen()是否成功。
  • 为了正确结束文件测试,必须将
  • c定义为int
  • 您必须先使用rewind(fp1);fseek(fp1, 0L, SEEK_SET);来倒带文件,然后再使用fscanf()来解析内容
  • 循环索引i必须从0而不是1开始,因为数组是基于0的。
  • 在C语言中习惯使用for (i = 0; i < 10; i++) ...处理10行输入。 i <= 10将迭代11次。
  • 您必须检查fscanf()的返回值,以确保输入流具有预期的格式。格式字符串不能处理空的文本字段。
  • fscanf()格式的字符串与提供的参数不兼容
  • printf格式的字符串"%d\n"与参数的类型不兼容:参数是数组c3,它作为指向其第一个成员的指针而不是{{ 1}}。

答案 1 :(得分:0)

只需循环读取一行,直到没有更多行

#include <stdio.h>
#include <string.h>
#define MAX_ITEMS 10000
#define LARGEST_LINE 1000
#define LARGEST_ELEMENT 100

int main(void) {
    int c1[MAX_ITEMS];
    char c2[MAX_ITEMS][LARGEST_ELEMENT+1]; // large enough for each `c2`
    char c3[MAX_ITEMS][LARGEST_ELEMENT+1];
    char c4[MAX_ITEMS][LARGEST_ELEMENT+1];
    char c5[MAX_ITEMS][LARGEST_ELEMENT+1];
    int c6[MAX_ITEMS];
    int c7[MAX_ITEMS];

    int tmpc1;
    char tmpc2[LARGEST_ELEMENT+1];
    char tmpc3[LARGEST_ELEMENT+1];
    char tmpc4[LARGEST_ELEMENT+1];
    char tmpc5[LARGEST_ELEMENT+1];
    int tmpc6;
    int tmpc7;

    int lineno = 0;
    char buf[LARGEST_LINE]; // large enough for the largest line
    while (fgets(buf, sizeof buf, fp1)) {
        ++lineno;
        // no error, process line
        if (sscanf(buf, "%d,"
                        "%" LARGEST_ELEMENT "[^,],"
                        "%" LARGEST_ELEMENT "[^,],"
                        "%" LARGEST_ELEMENT "[^,],"
                        "%" LARGEST_ELEMENT "[^,],"
                        "%d,%d",
              &tmpd1, tmpc2, tmpc3, tmpc4, tmpc5, &tmpd6, &tmpd7) == 7) {
            // line ok, copy tmp variables and update indexes
            c1[i] = tmpd1;
            strcpy(c2[i], tmpc2);
            strcpy(c3[i], tmpc3);
            strcpy(c4[i], tmpc4);
            strcpy(c5[i], tmpc5);
            c6[i] = tmpd6;
            c7[i] = tmpd7;
            i++;
        } else {
            // line with error, you may want to report to the user
            fprintf(stderr, "line %d with error.\n", lineno);
        }
    }
    // read "error", probably EOF; close file and report
    fclose(fp1);
    for (int j = 0; j < i; j++) {
        printf("item #%d: %d, %s-%s-%s-%s, %d %d\n",
              c1[j], c2[j], c3[j], c4[j], c5[j], c6[j], c7[j]);
    }
return 0;
}

还考虑将所有这些c数组放入一个结构中,并制作该结构的单个数组。