LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 782|回复: 1

一个读取文件中的数据到数组的问题

[复制链接]
发表于 2007-4-4 16:31:58 | 显示全部楼层 |阅读模式
这是存放数据的文件 test.txt

  1. 1041 1467 7334 9500 2169 7724 3478 3358 9962 7464
  2. 6705 2145 6281 8827 1961 1491 3995 3942 5827 6436
  3. 6391 6604 4902 1153 1292 4382 9421 1716 2718 2895
复制代码

想把它们读到两个数组中,一个是整型a,一个是double b,源文件和运行结果
分别如下

  1. #include <stdio.h>

  2. #define MAX 30
  3. int main()
  4. {
  5.     int i = 0 ;
  6.     FILE *fp ;
  7.     int a[30] = {0};
  8.     if( (fp = fopen("test.txt", "r")) == NULL )
  9.         printf("Open file fail!!!\n");
  10.     for(i = 0 ; i < MAX ; i++)
  11.     {
  12.         fscanf(fp, "%i", &a[i]) ;
  13.         printf("%i\t",a[i]);
  14.     }
  15.    
  16.     fclose(fp);

  17.     return 0;
  18. }
复制代码

结果正确;



  1. #include <stdio.h>

  2. #define MAX 30
  3. int main()
  4. {
  5.     int i = 0 ;
  6.     FILE *fp ;
  7.     double b[30] = {0};
  8.     if( (fp = fopen("test.txt", "r")) == NULL )
  9.         printf("Open file fail!!!\n");
  10.     for(i = 0 ; i < MAX ; i++)
  11.     {
  12.         fscanf(fp, "%g", &b[i]) ;
  13.         printf("%g\t",b[i]);
  14.     }
  15.            
  16.     fclose(fp);
  17.     return 0;
  18. }
复制代码


结果显示b还是zero,不成功。问题在哪里呢?

知道原因了,fscanf在读入double类型数据时

  1. fscanf(fp,"%lf",&double_var);
复制代码



另外,如果test.txt文件是如下的形式

  1. a        b       c        d       e       f       g        h       i       j
  2. =============================================   
  3. 1041 1467 7334 9500 2169 7724 3478 3358 9962 7464
  4. 6705 2145 6281 8827 1961 1491 3995 3942 5827 6436
  5. 6391 6604 4902 1153 1292 4382 9421 1716 2718 2895
复制代码

怎么才能跳过前两行,直接读后面的数据呢?

我的办法是定义一个字符串指针,然后把前面用不到的数据读进去,接下来再读数据

  1. ...
  2. char *sp;
  3. ....
  4. fread(sp,sizeof(char),num,fp);
  5. fscanf...
复制代码


这样虽然可行,但是得数一下前面的字符,有点儿笨。

不知道fseek能不能帮助定位文件指针。

大家都怎么处理的。
发表于 2007-4-4 21:15:44 | 显示全部楼层
搜索结束符,
找到第二个,后面就是第三行了,跳过了前面两行了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表