文件操作系列之一——(C Run-Time Library)

现在要做一个东西出来,因为涉及的知识面比较广,所以需要系统的把知识整理一下,刚好用到文件操作这一块,就整理了一下相关的要点。

操作文件的方式很多,这里重点介绍几个,本次介绍C Run-Time Library的文件操作方式。

C Run-Time Library中操作文件的方式又有两种,一种是直接使用库的API来进行;一种是使用FILE的I/O标准流操作来进行。下面分别说明。

一使用C Run-Time Library库的API来操作文件 。因为C Run-Time Library是过程语言,所以没有类的概念,里面的函数大多是过程的。如下面的例子:

读文件:

char buffer[60000]; int fh; unsigned int nbytes = 60000, bytesread; /* Open file for input: */ if( _sopen_s( &fh, "1.txt", _O_RDONLY, _SH_DENYNO, 0 ) ) { perror( "open failed on input file" ); exit( 1 ); } /* Read in input: */ if( ( bytesread = _read( fh, buffer, nbytes ) ) <= 0 ) perror( "Problem reading file" ); else printf( "Read %u bytes from file/n", bytesread ); _close( fh );

写文件:

int fileHandle = 0; unsigned bytesWritten = 0; char buffer[] = "This is a test of '_write' function"; if ( _sopen_s(&fileHandle, "write.o", _O_RDWR | _O_CREAT, _SH_DENYNO, _S_IREAD | _S_IWRITE) ) return; if (( bytesWritten = _write( fileHandle, buffer, sizeof( buffer ))) == -1 ) { switch(errno) { case EBADF: perror("Bad file descriptor!"); break; case ENOSPC: perror("No space left on device!"); break; case EINVAL: perror("Invalid parameter: buffer was NULL!"); break; default: // An unrelated error occured perror("Unexpected error!"); } } else { printf_s( "Wrote %u bytes to file./n", bytesWritten ); } _close( fileHandle );

 

二使用标准I/O的FILE流操作文件。 其实这种方式也属于C Run-Time Library库函数,不过它引入新的结构FILE,操作处理上面要比直接使用库函数简单一些。如下面的例子:

读文件:

char filename[50]; cout<<"Pleast input the file name you want to Read:/n"; cin>>filename; FILE *stream; char list[30]; int numread; if( fopen_s( &stream, filename, "r+t" ) == 0 ) { // Attempt to read in 25 characters numread = fread( list, sizeof( char ), 25, stream ); printf( "Number of items read = %d/n", numread ); printf( "Contents of buffer = %.25s/n", list ); fclose( stream ); } else printf( "File could not be opened/n" );

写文件:

char filename[50]; cin>>filename; FILE *stream; char list[30]; int i, numwritten; // Open file in text mode: if( fopen_s( &stream, filename, "w+t" ) == 0 ) { for ( i = 0; i < 25; i++ ) list[i] = (char)('z' - i); // Write 25 characters to stream numwritten = fwrite( list, sizeof( char ), 25, stream ); printf( "Wrote %d items/n", numwritten ); fclose( stream ); } else printf( "Problem opening the file/n" );

代码很简单,不用太多解释,细节可参考MSDN上面的函数说明,也可参考微软的C Run-Time Library函数参考手册(后附做好的手册下载)。

使用Run-Time Library函数来操作文件是非常有效率的,它就如C/C++语言的优势一样,依赖语言而脱离系统,而且有比较高的内存利用率和较低的时间花费。

可缺点也是一样的,安全性低,直接操作内存的复杂度高。

对于使用Run-Time Library感兴趣的,可参考微软《C Run-Time Library函数参考手册》。

附,本系列示例代码 ,该代码在VS2008+XPsp3下测试通过。

下一篇,开始讲述面向对象方式的文件操作方式

你可能感兴趣的:(c,Stream,File,buffer,library,Descriptor)