c语言IO库函数学习
看下面的代码,通过代码来学习C语言IO库函数
/* 
#include <stdio.h> 
int sprintf( char *buffer, const char *format, ... ); 
#include <stdio.h> 
int printf( const char *format, ... ); 
已有介绍 
#include <stdio.h> 
int fprintf( FILE *stream, const char *format, ... ); 
类似上两函数,只是该函数用于文件操作 
#include <stdio.h> 
int scanf( const char *format, ... ); 
函数以给定字符串的格式从标准输入流中读入数据(stdin) 
将数据保存在给定参数中,它忽略空格(tab,spaces,etc) 
跳过不符合的字符,返回被赋值的变量数,若出错返回EOF 
控制符如下: 
%c a single character 
%d a decimal integer 
%i an integer 
%e, %f, %g a floating-point number 
%o an octal number 
%s a string 
%x a hexadecimal number 
%p a pointer 
%n an integer equal to the number of characters read so far 
%u an unsigned integer 
%[] a set of characters 
%% a percent sign 
scanf()会将输入的数据根据参数format字符串来转换并格式化数据。Scanf()格式转换的一般形式如下 
%[*][size][l][h]type 
以中括号括起来的参数为选择性参数,而%与type则是必要的。 
* 代表该对应的参数数据忽略不保存。 
size 为允许参数输入的数据长度。 [Page]
l 输入的数据数值以long int 或double型保存。 
h 输入的数据数值以short int 型保存。 
[] 读取数据但只允许括号内的字符。出现其他字符则终止。如[a-z]。 
[^] 读取数据但不允许中括号的^符号后的字符出现,如[^0-9]. 
返回值 成功则返回参数数目,失败则返回-1,错误原因存于errno中。 
#include <stdio.h> 
int sscanf( const char *buffer, const char *format, ... ); 
函数用法同scanf,只是该函数的数据是从buffer中读入的 
#include <stdio.h> 
int fscanf( FILE *stream, const char *format, ... ); 
函数类似上函数,只是该函数用于文件操作 
#include <stdio.h> 
char *gets( char *str ); 
从标准输入(stdin)中读入一行数据或是遇到错误,并且在最后加入’ ’值 
#include <stdio.h> 
char *fgets( char *str, int num, FILE *stream ); 
类似上函数,该函数用与文件操作,返回读到的字符串,如果有错返回EOF,参数num为最多能读的数据(num-1,最后一个为null值) 
若连续用fgets函数读文件中的数据,则应用fseek函数移动文件指针到下一行初(fseek(file, 2, SEEK_CUR) 
在windows中,换行为两个字符,即回车换行 
#include <stdio.h> 
int getchar( void ); 
从stdin中读入一个字符返回,注意返回为int型 
#include <stdio.h> 
int fgetc( FILE *stream ); 
返回文件流中的下一个字符,返回EOF如果读到文件末尾或发生错误 
#include <stdio.h> 
int getc( FILE *stream ); 
同上一个函数 
#include <stdio.h> 
int putchar( int ch ); 
在stdin中写入一个字符,返回EOF如果出错,否则返回写入的字符 
#include <stdio.h> 
int putc( int ch, FILE *stream ); 			
在文件流中写入一个字符,返回EOF如果出错,否则返回写入的字符 
#include <stdio.h> 
int puts( char *str ); 
在文件中写入str字符,如果出错返回EOF值,否则返回非负数值 [Page]
#include <stdio.h> 
int fread( void *buffer, size_t size, size_t num, FILE *stream ); 
读入文件中的数据到buffer,总共大小为num,size表明读入类型的字节大小,返回值为读入的字节数 
#include <stdio.h> 
int fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); 
函数将buffer中的内容写入文件中,总共写入cout个size大小的数据,返回写入数据大小的字节数 
#include <stdio.h> 
int feof( FILE *stream ); 
如果文件没有读到末尾,返回0,否则返回非0 
#include <stdio.h> 
int ferror( FILE *stream ); 
若文件没有错误发生,返回0,否则返回非0 
#include <stdio.h> 
void perror( const char *str ); 
打印字符串str和errno相关的错误信息 
#include <stdio.h> 
void clearerr( FILE *stream ); 
重新设置stream的错误标识和EOF指示器(错误标识不会自动清除,除非调用clearerr, fseek, fsetpos, or rewind 等函数) 
#include <stdio.h> 
int fclose( FILE *stream ); 
函数关闭stream文件,释放所有和stream相关的内存资源 
#include <stdio.h> 
FILE *fopen( const char *fname, const char *mode ); 
函数fname指定的文件,若文件不存在,则新建该文件,mode表示打开文件的模式,若出错,返回NULL 
/"r/" Open a text file for reading 
/"w/" Create a text file for writing 
/"a/" Append to a text file 
/"rb/" Open a binary file for reading 
/"wb/" Create a binary file for writing 
/"ab/" Append to a binary file 
/"r /" Open a text file for read/write 
/"w /" Create a text file for read/write [Page]
/"a /" Open a text file for read/write 
/"rb /" Open a binary file for read/write 
/"wb /" Create a binary file for read/write 
/"ab /" Open a binary file for read/write 
#include <stdio.h> 
int fgetpos( FILE *stream, fpos_t *position ); 
函数将给定文件的指针存入position变量中,函数成功返回0,否则返回非0 
fpos_t类型:long integer, __int64, or structure, depending on the target platform 
#include <stdio.h> 
int fsetpos( FILE *stream, const fpos_t *position ); 
函数用于设定文件指针,其他规则同fgetpos函数 
#include <stdio.h> 
FILE *freopen( const char *fname, const char *mode, FILE *stream ); 
函数重新定向stream的文件流到指定文件的文件流,mode用于指定文件的访问方式 
函数返回NULL值如果出错,否则返回新文件的文件指针 
注:可用该函数打开一个文件,并一stdout,stdin做参数,此时可以用在控制台上的函数操作文件 
但是有一个问题需要解决,怎样把stdout,stdin的指针重新弄回来,以使控制台的输入输出还可用 
因为该函数执行后会将原来的文件流(stream)指针关闭。在VC中可以通过结合dup和fdopen函数来实现 
但是在C语言函数库中还不知道用什么函数可以去实现 
#include <stdio.h> 
int fseek( FILE *stream, long offset, int origin ); 
函数设置文件流stream指针到给定的偏移量,偏移量与origin相对而言
origin可取值: 
SEEK_SET Seek from the start of the file 
SEEK_CUR Seek from the current location 
SEEK_END Seek from the end of the file 
函数返回0为成功,非0为失败,该函数可以清除EOF标记 [Page]
#include <stdio.h> 
long ftell( FILE *stream ); 
函数返回指定文件的当前指针的位置,若出错返回-1 
#include <stdio.h> 
int remove( const char *fname ); 
函数关闭fname名字所指定文件流,返回0为成功执行函数,非0为失败 
#include <stdio.h> 
int rename( const char *oldfname, const char *newfname ); 
函数更改文件的名字,返回0为成功,非0为失败 
#include <stdio.h> 
void rewind( FILE *stream ); 
函数将指定文件的指针移动到文件的开始处,并清除文件的EOF标识 
#include <stdio.h> 
void setbuf( FILE *stream, char *buffer ); 
函数设置文件的缓存区buffer,若buffer为NULL值,则文件写入没有缓冲 
#include <stdio.h> 
int setvbuf( FILE *stream, char *buffer, int mode, size_t size ); 
函数用特定的模式设置文件的缓冲区及大小 
mode可取值: 
_IOFBF, which indicates full buffering 
_IOLBF, which means line buffering 
_IONBF, which means no buffering 
#include <stdio.h> 
FILE *tmpfile( void ); 
函数打开一个临时文件并返回这个临时文件的指针,失败则返回NULL 
#include <stdio.h> 
char *tmpnam( char *name ); 
函数创建一个临时文件的文件名,保存在name中 
#include <stdio.h> 
int ungetc( int ch, FILE *stream ); 
函数将ch字符放回stream文件中 
#include <stdarg.h> 
#include <stdio.h> 
int vprintf( char *format, va_list arg_ptr ); 
int vfprintf( FILE *stream, const char *format, va_list arg_ptr ); 
int vsprintf( char *buffer, char *format, va_list arg_ptr ); [Page]
These functions are very much like printf(), fprintf(), and sprintf(). 
The difference is that the argument list is a pointer to a list of arguments. 
va_list is defined in stdarg.h, and is also used by (Other Standard C Functions) 
va_arg(). For example: 
void error( char *fmt, ... ) { 
va_list args; 
va_start( args, fmt ); 
fprintf( stderr, /"Error: /" ); 
vfprintf( stderr, fmt, args ); 
fprintf( stderr, /"/n/" ); 
va_end( args ); 
exit( 1 ); 
} 
*/ 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
/**//*void main() 
{ 
char setTest[10]; 
scanf(/"%[a-z]/", setTest); 
printf(/"%s /", setTest); 
}*/ 
/**//*void main( void ) 
{ 
int c; 
//Create an error by writing to standard input. 
putc( ’c’, stdin ); 
if( ferror( stdin ) )
{ 
perror( /"Write error/" ); 
clearerr( stdin ); 
} 
// See if read causes an error. 
printf( /"Will input cause an error? /" ); 
c = getc( stdin ); 
if( ferror( stdin ) ) 
{ 
perror( /"Read error/" ); 
clearerr( stdin ); 
} 
}*/ 
/**//*void main() 
{ 
char read[100]; 
FILE *orig_stdout = (FILE*)malloc(sizeof(FILE)); [Page]
memcpy(orig_stdout, stdout, sizeof(FILE)); 
FILE *filew = freopen(/"test.txt/", /"w/", stdout); 
//freopen(/"test.txt/", /"w/", stdout); 
if(filew == stdout) 
printf(/"equal/"); 
printf(/"We can write datum in file test.txt use printf function with the use of freopen/"); 
fclose(filew); 
/* memcpy(stdout, orig_stdout, sizeof(FILE)); 
FILE *filer = freopen(/"test.txt/", /"r/", stdin); 
//freopen(/"test.txt/", /"r/", stdin); 
gets(read); 
fclose(filer); 
printf(/"%s/", read); 
printf(/"%c/", read[0]); 
printf(/"jd;salkjf/"); 
*/ 
// rename(/"test.txt/", /"newname.txt/"); 
/