关于fprintf()和fscanf()

原创 2007年11月19日 16:33:00

fprintf、fscanf的读写对象不是终端而是磁盘文件;
调用方式为:int   fprintf(文件指针,格式字符串,输出表列 )返回值:返回实际输出的字符数,
操作不成功返回EOF
int fscanf(文件指针,格式字符串,输入表列 )返回值:返回输入的数据个数,操作不成功返回EOF
fprintf(fp, "%d, %6.2f",   i, t)  将整型变量 i 和实型变量 t 的值按%d和%6.2f的格式输出到fp所指向的文件中;  若i=3,t=4.5,则输出到磁盘中的格式为:3,    4.50相应的,从文件中读取数据时,则应用:fscanf(fp, "%d, %f",   &i, &t)

 

在运用fprintf与fscanf时,在向文件输出数据及从文件读取数据时,分隔符应该相一致。如下程序所示,该程序的功能是:用户输入8个整型数据,程序回显并把数据写到int.txt文件中,然后程序再从int.txt文件中读取数据,并显示出来。
#include <stdio.h>
main()
{
   FILE *fp;
   int i,ss[8],new[8];
   for(i=0;i<8;i++){
     scanf("%d",&ss[i]);
   }
   fp=fopen("int.txt","w");
   printf("start diesplay old data!/n");
   for(i=0;i<8;i++){
      printf("%d:%-10d/n",i+1,ss[i]);
      fprintf(fp,"%d,",ss[i]);  /*输出数据时以逗号为数据之间的分隔符*/
   }
   fclose(fp);
   printf("Now diseplay read date!/n");
    if((fp=fopen("int.txt","r"))==NULL) return 1;
    for(i=0;i<8;i++){
      fscanf(fp,"%d,",&new[i]);  /*输入数据时以逗号为数据之间的分隔符,这样做到前后一致,                                                                                 读取数据不会错*/

      printf("%d:%-10d/n",i+1,new[i]);
    }
    fclose(fp);
}

分隔符也可采用/n,即回车符,那么程序中二句相应改为:
fprintf(fp,"%d/n",ss[i]);
fscanf(fp,"%d/n",&new[i]); 

 

 

使用fprintf和fscanf的优点:

使用fread和fwrite的优点就是二进制的读取是最快的。但是它们有缺陷,就是在

读取的时候 while(!feof(fp)) 不精确,往往会发现它多循环了一次。因为feof

()是根据剩余字符来判断是否文件结尾的,而文件的结尾标识符是'/0'是两个字

节,在读取'/'的时候feof()还是为false只有读取完'/0'的时候feof()==true。

致使产生多余的循环(如果使用while(!feof(fp))的话)。使用fprintf和fscanf

,因为这两个函数具有输入/输出的格式限制,即使在读取'/0'处有多余的循环,

但由于其不满足输入/输出格式,所以多余的循环被屏蔽掉。

最好就是这样:"%d/t%d/t" 这样的每个数字后面都是有限制的,这样就可以起到

很好的屏蔽作用。^^

 

 

对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数:

·字符读写函数 :fgetc和fputc

·字符串读写函数:fgets和fputs

·数据块读写函数:fread和fwrite

·格式化读写函数:fscanf和fprinf

随着每次数据的读取,文件流指针fp都作相应的移动

使用以上函数都要求包含头文件stdio.h。例子都来自msdn

1 fprintf——Print formatted data to a stream

#include <stdio.h>
#include <process.h>

FILE *stream;

void main( void )
{
   int     i = 10;
   double fp = 1.5;
   char    s[] = "this is a string";
   char    c = '/n';

   stream = fopen( "fprintf.out", "w" );
   fprintf( stream, "%s%c", s, c );
   fprintf( stream, "%d/n", i );
   fprintf( stream, "%f/n", fp );
   fclose( stream );
   system( "type fprintf.out" );
}

Output

this is a string101.500000
2 fscanf——Read formatted data from a stream
#include <stdio.h>FILE *stream;void main( void ){    long l;    float fp;    char s[81];    char c;    stream = fopen( "fscanf.out", "w+" );    if( stream == NULL )       printf( "The file fscanf.out was not opened/n" );    else    {       fprintf( stream, "%s %ld %f %c", "a-string",                 65000, 3.14159, 'x' );       /* Set pointer to beginning of file: */       fseek( stream, 0L, SEEK_SET );       /* Read data back from file: */       fscanf( stream, "%s", s );       fscanf( stream, "%ld", &l );       fscanf( stream, "%f", &fp );       fscanf( stream, "%c", &c );       /* Output data read: */       printf( "%s/n", s );       printf( "%ld/n", l );       printf( "%f/n", fp );       printf( "%c/n", c );       fclose( stream );    }}Outputa-string650003.141590x3 fread——Reads data from a stream
4 fwrite——Writes data to a stream
读数据块函数调用的一般形式为: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中: buffer 是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。 count 表示要读写的数据块块数。 fp 表示文件指针。
5 fgets 没有看出与fread太大的区别,除了fread可以处理string外的其他不同文件的数据类型
6 fputs
7 fgetc fputs
从键盘输入一行字符,写入一个文件,再把该文件内容读出显示在屏幕上。 #i nclude main() { FILE *fp; char ch; if((fp=fopen("d://jrzh//example//string","wt+"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } printf("input a string:/n"); ch=getchar(); while (ch!='/n') { fputc(ch,fp); ch=getchar(); } rewind(fp); //Repositions the file pointer to the beginning of a filech=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf("/n"); fclose(fp); }

 

相关文章推荐

fscanf()函数详解

以前解析有规律的文件的时候要么用正则表达式,要么就是傻傻的自己写程序来解析有规律的文件。今天突然发现c的库函数中有一个现成的可以解析有规律的文件的函数,就是fscanf()函数。哎 以前自己做了这么多...

C语言初学之fscanf()函数理解

c语言初学之fscanf的相关理解

fscanf()函数详解

这两天在做语法分析程序,因为之前写完了词法分析程序,所以做语法分析时直接读取了词法分析的“out.txt”文件(单词流文件)。在读取时,遇到fscanf(fp, "%s %s\n", token, t...
  • MMogega
  • MMogega
  • 2016年11月22日 16:53
  • 2749

fscanf()函数详解

功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。 用 法:int fscanf(FILE *stream, char *format,[argument....

scanf/fscanf 的%[]和%n使用方法

标准输入输出函数%[]和%n说明符的使用方法     scanf fscanf,均从第一个非空格的可显示字符开始读起!         标准输入输出函数scanf具有相对较多的转换说明符,它常常作...

fgets和fscanf区别

一、作用上的大概区别:①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往缓冲区写多一个\0,所以它是读一行数据)②fscanf...

scanf,fscanf,sscanf的区别----整理

scanf 从控制台输入 fscanf 从文件输入 sscanf 从指定字符串输入 大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,...

fscanf与scanf

标准输入输出函数%[]和%n说明符的使用方法    scanf fscanf,均从第一个非空格的可显示字符开始读起!         标准输入输出函数scanf具有相对较多的转换说明符,它常常作为...
  • CHNIM
  • CHNIM
  • 2017年05月24日 21:39
  • 190

C语言之文件读写——fscanf(),fprintf()详解

1.fscanf():从文件指针fp指向的文件中,按format中对应的控制格式读取数据,并存储在agars对应的变量中; 原型: fscanf(FILE *fp, const char *form...
  • jhg1204
  • jhg1204
  • 2012年09月01日 20:28
  • 8405

scanf/fscanf 的%[]和%n使用方法

标准输入输出函数%[]和%n说明符的使用方法    scanf fscanf,均从第一个非空格的可显示字符开始读起!        标准输入输出函数scanf具有相对较多的转换说明符,它常常作为入门级...
  • wesweeky
  • wesweeky
  • 2011年05月23日 15:10
  • 21906
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于fprintf()和fscanf()
举报原因:
原因补充:

(最多只允许输入30个字)