C语言读取文件数据

假设我有一个数据文件,共有500行数据,每行数据的个数不相同,比如第一行有6个int型数据,第二行有7个,第三行有8个。。。但数据类型都一样,请问哪个函数可以方便的读取每行的数据,从而通过一个for循环将所有数据读取出来?

先用getline或fgets读取数据到一个字符串中,这个串定义的长一点,保证够用就行。

举例:

char str[1024]。

fgets( str , sizeof(str), fp ),//fp打开的文件指针。

然后调用for循环去读取串的的数据,假设你的分隔符是空格,遍历str,遇到空格就得到一个数据,然后继续遍历,直到str尾。

再去fgets数据,再遍历,即可得到所有的数据。

拓展资料:

C语言是一门通用计算机编程语言,广泛应用于底层开发。

C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-08
先用getline或fgets读取数据到一个字符串中,这个串定义的长一点,保证够用就行,如:
char str[1024];
fgets( str , sizeof(str), fp ); //fp为你打开的文件指针

然后调用for循环去读取串的的数据,假设你的分隔符是空格,遍历str,遇到空格就得到一个数据,然后继续遍历,直到str尾。
然后再去fgets数据,再遍历,即可得到所有的数据。追问

能否给出具体代码,用fgets得到的是字符串,用哪个函数来遍历这个字符串并将其中的数据由字符串转为int型数据?

追答

等一下再追问,或解除推荐,用strtok函数加atoi可轻松搞定。
关键是你读到的数据,怎么保存?是输出来就可以了吗?

追问

对,先简单输出到屏幕,其他操作我后面再添加。

追答

测试一下吧,注意修改一下文件名
#include
#include
#include

int main()
{
FILE *fp;
fp=fopen("test.txt" , "r" );//文件名你自己去指定,这里暂用test.txt
if ( fp == NULL )
{
printf("open file error\n");
return -1;
}
while( !feof(fp) )
{
char str[1024];
char *p;
if ( fgets(str , sizeof(str) , fp)==NULL )
break ;
p=strtok( str , " " );
while ( p )
{
printf("%d " , atoi(p) );
p=strtok(NULL," " );
}
printf("\n");
}
fclose(fp);
return 0;
}

本回答被提问者采纳
第2个回答  2012-11-14
如果允许不按行读取,用scanf读整数即可,scanf会自动忽略换行和其它空白符。
for(;;)
{
if(fscanf(fp, "%d", &n) != 1) break;
//处理读入的整数

}

如果要按行读取,需要两层循环, 外层用fgets, 内层用sscanf.追问

能具体说一下按行读取的话内层怎么循环吗?因为现在不确定每行有多少个数据。。。多谢

追答

可以这样(下面用sscanf举例, 你也可以用strtok和atoi实现):

#define BUF_SIZE 100
char buf[BUF_SIZE];
char 星号 p;
int n;
...

while(fgets(s, sizeof(buf), fp)){
p = buf;

while(sscanf(p, "%d", &n) == 1){
//处理整数
//假设分隔符是空格,如果是tab换成\t。
//跳过前置空格:
while(p[0] == ' ') p++;

//跳过处理的整数,指针停在下一个空格(下面一个整数至少有一个前置空格):
while((p[0] != ' ') && (p[0] != '\0')) p++;

//如果停在字符串尾(可能跳过’\n'),跳出内循环

if(p[0] == '\0') break;

}
}

第3个回答  推荐于2017-09-12

使用fopen,fscanf函数即可读取文件数据。

1、fopen的函数原型:FILE * fopen(const char * path,const char * mode);
  fopen函数的第一个参数是文件路径,第二个参数是打开方式,有以下几种方式:
  r 以只读方式打开文件,该文件必须存在。
  r+ 以可读写方式打开文件,该文件必须存在。
  rb+ 读写打开一个二进制文件,允许读数据。
  rw+ 读写打开一个文本文件,允许读和写。
  w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
  w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
  a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
  a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
  wb 只写打开或新建一个二进制文件;只允许写数据。
  wb+ 读写打开或建立一个二进制文件,允许读和写。
  wt+ 读写打开或着建立一个文本文件;允许读写。
  at+ 读写打开一个文本文件,允许读或在文本末追加数据。
  ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
  上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
    返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

2、例程:

#include<stdio.h>
#define F_PATH "d:\\myfile\\file.dat"
char c;
int main(){
    FILE*fp=NULL;//需要注意
    fp=fopen(F_PATH,"r");
    if(NULL==fp) return -1;//要返回错误代码
    while(fscanf(fp,"%c",&c)!=EOF) printf("%c",c); //从文本中读入并在控制台打印出来
    fclose(fp);
    fp=NULL;//需要指向空,否则会指向原打开文件地址    
    return 0;
}

第4个回答  2012-11-14
把数据发给我![email protected]我大概能搞定