C语言中如何读取以逗号分割的文件中的数据?

一个 aw.txt 的文件,逗号隔开,里面类似“
0.12 0.123 0.534,0.324 0.25 0.5"
每个逗号里面有空格、小数点,逗号数量未知,但两逗号间最多15个字符。我要分别把两个逗号之间的字符(包括空格)取出来,单独放到其他数组里面。

求帮!!

对于这个问题,有两种解决方案。

一,直接用scanf进行格式化输入。

满足以下两种条件可以用scanf进行输入:

1 要输入的数据中不能有空白符号,因为用scanf输入时空白符号会被忽略。

空白符号包括空格(' '),制表符('\t'),换行符('\n')等。

2 文件中被分隔开的数据类型是以一定的固定规律出现的。

举几个典型的例子供理解。

例一:

所有都是都在一行,均为int型且都用逗号分隔

或者即使有换行,那么换行前最后一个数据后面仍有逗号分隔。

也就是说,任意两个有效数据之间有且只有一个逗号分隔。

那么可以循环调用

scanf("%d,",&v);

来依次把数据读到v中并处理。

例二:文件有多行,每行依次为int, double,char的格式,且每行结尾的数据后面没有逗号。

可以定义

int a;

double b;

char c;

然后循环调用

scanf("%d,%lf,%c", &a,&b,&c);

再处理a,b,c的值。


二,循环读入单个字符,再处理字符串。

此种方法适用于输入的数据中有空白字符的情况,较为复杂。关键代码入下:

#include <stdio.h>
void read_file(FILE *fp)//fp ä¸ºæ‰“开的可读文件的指针
{
    char buf[100]; //定义一个足够大的buf,具体空间依实际应用
    int ret, i=0;
    
    while(1)
    {
        ret = fgetc(fp);
        if(ret == EOF || ret == ',')//这里约定结束的标识,如果换行也可以作为结束标识,则这里可以增加||ret == '\n'
        {
            buf[i] = 0;
            printf("get value:%s\n",buf);
            //获取到一个合法数据,如果需要处理可以在这里进行。
            i = 0;//为下一个输入做准备
        }
        //else if();//这里不做任何事。如果有什么需要忽略的字符,可以加在这一行,比如忽略换行,可以加else if(ret == '\n');
        else buf[i]++=ret;
        
        if(ret == EOF)break;//到文件结尾退出。
    }
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-30
每次用fgets读取整行,然后扫描一遍,看看逗号数量是不是足够一个完整结构体了。
如果不够,继续fgets,注意要读取到上一次fgets内容的末尾。然后再度检查逗号数量。

如果逗号数量够了(也就是内容已经足够一个结构体了),先去掉换行符。
然后每次先用strchr找到下一个逗号,再用strncpy将当前位置到下一个逗号的内容拷贝到结构体相应成员变量中。

读完当前结构体后,用memmove将未处理的内容前移到缓冲区开头。
第2个回答  推荐于2017-10-02
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *file = fopen("aw.txt", "rb");
if(!file){
printf("error!\n");
return -1;
}

char vec[255][255] = {0};
int i = 0, j = 0;
while (!feof(file))
{
char c = fgetc(file);

if(c != ',')
vec[i][j++] = c;
else{
i++;
j = 0;
}
}
fclose(file);

for(int k = 0; k <= i; k++)
printf("%s\n", vec[k]);

return 0;
}本回答被提问者采纳
第3个回答  2012-05-10
直接读就可以了
比如说
scanf("%f ,%f ,%f", &f1, &f2, &f3); // %f后面加个空格再加个逗号
或者循环也可以的
while(scanf("%f ,", &farray[xxx]))
{
}追问

逗号的数量不知道,起止都没有任何标记,scanf办不到

追答

那么一次读入到一个大字符串中. , 比如说 str_all
然后
char list[500][20]; // 保存新字符串的位置
const char* first = atr_all ; // 复制的起点
const char* next = atr_all ; // 逗号的位置
for (int i = 0 ; *next != '\0'; ++next)
{
if (*next == ',') // 发现逗号
{
memcpy(list[i], first, next-first); // 复制内容到list
first = next+1; // 把复制的起点指向逗号之后的一个位置, 为下次复制做准备
++i; // list 下标+1
}
}

我学的是C++, 对C的文件读取不熟悉, 只能在算法上提供点帮助了

第4个回答  2015-05-25
在C语言中,可以使用格式化输入函数fscnaf来解决上述问题,例如有文本文件的数据保存方式为:
12,13
34,56
......
则在fscnaf中可以按如下方法输入:
fscanf(fp,"%d,%d\n",&a,&b);
相似回答