大神帮忙看下这个是咋回事,用C语言读csv文件到数组,语法有问题,不知道是哪里错了?

csv文件里有多行数据,每行数据的长度都不一样,数据之间还有逗号,怎么判断逗号并去掉,读完一行后怎么判断然后继续读下一行呢,如图所示,图中注释部分要不要结果都是一样的,代码有问题,不知道咋改了
最新回答
惹我细心溺屎身亡

2024-11-29 20:22:39

个人认证用户

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX_LINE 1024


int main(){

    FILE *fp=NULL;

    fp = fopen("test.csv","r");

    char a[1024];

    char *p;

    char *q;

    int len;

    int i = 0;

    int j = 0;

    fseek(fp,0L,0);

    while(fgets(a,MAX_LINE,fp) != NULL)

    {

        p = &a[0];

        q = &a[0];

        //printf("%s\n", a);

        while(*p!='\0'){

            while(*p !=','&&*p!='\0'&& *p != '\r' && *p != '\n'){ 

                p++;

            }

            char *part = (char *)malloc(100 * sizeof(char));

            int length = p - q;

            if (length>0){

                printf("%d",length);

                memcpy(part, q, length);

                part[length]= '\0';

                printf("%s\n",part);

            }

            p = p+1;

            q = p;

        }

    }

    return 0;

}


追问

开头输出了一个乱码,大神你这太复杂了我看不懂呀

抹不掉的痛

2024-11-29 12:04:32

不知道你要哪种格式的


追问
厉害啊大神,还有你这是已经存到数组里面去了吗?我需要把每行的数据放到数组里面去呢,你这个程序怎么改成每一行的数据读完后就放到数组里面,然后换行继续读下一行的,直到结束
追答

存数组

追问
厉害啊,我刚试了下,没有毛病耶;另外while循环里面我把EOF判断换成‘\n’后就可以只读当前一行对吧,那我想在while之前再加个循环,用来读取下一行的数据,因为我不能一次性读到文件末尾,我应该怎么加循环呢?就比如要读5行数据,就循环5次,第一次while读到‘\n’后就结束,再读第二行。。。。。这样

厉害啊,我刚试了下,没有毛病耶;另外while循环里面我把EOF判断换成‘\n’后就可以只读当前一行对吧,那我想在while之前再加个循环,用来读取下一行的数据,因为我不能一次性读到文件末尾,我应该怎么加循环呢?就比如要读5行数据,就循环5次,第一次while读到‘\n’后就结束,再读第二行。。。。。

还有每行数据最后若有连续的逗号的话,数组最后一位就是0,这个怎么解决呀

追答


追问

大神您好,我刚运行了你的代码,代码没问题,就是第一次读取文件开头的数据也变成0了,但是最后一位数组为0的情况没有了。然后我又在for循环5次里面的开头加了一个把k置为0,这样就不会把上一次循环读取的数据也存到数组里面,加之前和之后的截图如下:

就是开头有个0很奇怪,看了代码,不知道在哪里改,望大神再帮忙看下,谢谢

追答

我没改代码,只把csv内容换成了你的

没看到开头有0 什么的

追问
啊,这就奇怪了,我怎么换内容第一位都是0,会不会跟我用的软件有关,我用的是codeblocks
追答
跟编译器应该没关系
追问
我找到问题了,是csv文件的问题,重新建一个就好了,谢谢啊
仙味萝莉

2024-11-29 16:55:09

这个程序是利用了scanf的格式化,排除掉了非数字的字符
"%*[^0-9]%d" - %*[^0-9] 非数字的字符跳过,%d读取一个整形。
总体没用判断是否是 逗号分隔,因此回车也当作非数字符号忽略掉了。
下面程序增加了处理文件结束和文件头就是数字的情况,可以满足读出所有数字到数组的需求。

int main(void){
FILE * fp;
fp =fopen("t.csv","r");
unsigned char a[255];
int i=0, ret;
//number at the begin of file
ret = fscanf(fp, "%d", &a[i]);
if(1 == ret){
printf("%d:%d ", ret, a[i]);
i++;
}
for(; i<255; i++){
ret = fscanf(fp, "%*[^0-9]%d", &a[i]);
if(-1 == ret) break;
printf("%d:%d ", ret, a[i]);
}
printf("\n");
return 0;
}
追问
用你的程序跑了下,输出的还是没有自动换行呀,最后多了个0:0
追答
你是要对应csv文件的每一行进行输出?从需求上输出是一维数组,为何要换行?
换行的处理方法就完全不同了。
需要fgets取出每一行,再把每一行读入数组。
追问
是啊,就是要读一行到数组里面输出,然后换行继续读下一行的,直到结束
追答

那么需要换一个方案才行,你这个程序完全没用:


只为迩倾尽所有

2024-11-29 16:23:59

利用了scanf的格式化,排除掉了非数字的字符
"%*[^0-9]%d" - %*[^0-9] 非数字的字符跳过,%d读取一个整形。
总体没用判断是否是 逗号分隔,因此回车也当作非数字符号忽略掉了。
下面程序增加了处理文件结束和文件头就是数字的情况,可以满足读出所有数字到数组的需求。