关于C语言按行读取文件,读取其中数字,挨个转换成doube类型,存入数组

int main()
{
FILE *fp;
char buffer[50];
char filename[50];
int bufferLen;
int i;
int j = 0;
char c;
double c_number[50];

printf("Input file name: ");
scanf("%s", filename);

if((fp = fopen(filename, "rb")) == NULL)
{
    return -1;
}
while(fgets(buffer, 50, fp))
{
    for(i = 0; i < 50; i++)
    {
    c = buffer[i];
    if(c != ' ' && c != '\n' && c != '\r') //这里过滤,读取数字,文件有符号,空格什么的
    {
        c_number[j] = (double)atof(c); //这里想挨个转换double没有成功

        //sscanf(c, "%lf", c_number[j]);
        j++;
    }
    }
}
fclose(fp);

调试下,目测atof(c),而c是单个字符,这是不行的。最好用split函数切割成字符串,字符串才能解析为浮点数

为什么不直接用fscanf

恩 c为char 占 1个字节 double占8个字节

把c定义成 char c[2] = {0};

这里 c[0] = buffer[i];

然后就可以 c_number[j] = (double)atof(c);

  1. while(fgets(buffer, 50, fp)) 一直读取? 好像应该是while(fgets(buf,50,fp) != NULL)
  2. fgets得到的是一个字符指针,不一定是一个字符,是一行字符,根据你的要求,最多读取49个,因为最后一个'\0' 所以得到的buffer是一行数据,也就是buffer可能是一个double数据,而不是c
  3. 读取的字符数组buffer含49个字符加一个空字符,你用for循环赋值,那没有通过fgets得到内容(例如读取53.25),那么后边内容是什么?随机? 你把后边内容同样给c,好像没有意义吧,应该加判断 if (buffer[i] == '\0').
  4. 看你数组都用的50,你是想要读取50行,也就是读取50个double? 那应该是50次(fgets(buffer, count, fp),其中count是你要读取的最大double字符数加1或更大。

http://blog.csdn.net/hong__fang/article/details/43488265 C语言方法和C++相同