C语言中如何读取以逗号分割的文件中的数据?
一个aw.txt的文件,逗号隔开,里面类似“0.120.1230.534,0.3240.250.5"每个逗号里面有空格、小数点,逗号数量未知,但两逗号间最多15个字符。我...
一个 aw.txt 的文件,逗号隔开,里面类似“
0.12 0.123 0.534,0.324 0.25 0.5"
每个逗号里面有空格、小数点,逗号数量未知,但两逗号间最多15个字符。我要分别把两个逗号之间的字符(包括空格)取出来,单独放到其他数组里面。
求帮!! 展开
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;//到文件结尾退出。
}
}
展开全部
每次用fgets读取整行,然后扫描一遍,看看逗号数量是不是足够一个完整结构体了。
如果不够,继续fgets,注意要读取到上一次fgets内容的末尾。然后再度检查逗号数量。
如果逗号数量够了(也就是内容已经足够一个结构体了),先去掉换行符。
然后每次先用strchr找到下一个逗号,再用strncpy将当前位置到下一个逗号的内容拷贝到结构体相应成员变量中。
读完当前结构体后,用memmove将未处理的内容前移到缓冲区开头。
如果不够,继续fgets,注意要读取到上一次fgets内容的末尾。然后再度检查逗号数量。
如果逗号数量够了(也就是内容已经足够一个结构体了),先去掉换行符。
然后每次先用strchr找到下一个逗号,再用strncpy将当前位置到下一个逗号的内容拷贝到结构体相应成员变量中。
读完当前结构体后,用memmove将未处理的内容前移到缓冲区开头。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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;
}
#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;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接读就可以了
比如说
scanf("%f ,%f ,%f", &f1, &f2, &f3); // %f后面加个空格再加个逗号
或者循环也可以的
while(scanf("%f ,", &farray[xxx]))
{
}
比如说
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的文件读取不熟悉, 只能在算法上提供点帮助了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在C语言中,可以使用格式化输入函数fscnaf来解决上述问题,例如有文本文件的数据保存方式为:
12,13
34,56
......
则在fscnaf中可以按如下方法输入:
fscanf(fp,"%d,%d\n",&a,&b);
12,13
34,56
......
则在fscnaf中可以按如下方法输入:
fscanf(fp,"%d,%d\n",&a,&b);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询