文件操作总结

1. 文件的打开函数

FILE *fopen( const char *filename, const char *mode );

FILE *_wfopen( const wchar_t *filename, const wchar_t *mode );

参数:filename 文件的名称mode 打开文件的模式

返回值:成功的打开文件的话返回 文件的指针 否则返回NULL表示打开文件错误 注:

“rt” 只读打开一个文本文件,只允许读数据

“wt” 只写打开或建立一个文本文件,只允许写数据

“at” 追加打开一个文本文件,并在文件末尾写数据

“rb” 只读打开一个二进制文件,只允许读数据

“wb” 只写打开或建立一个二进制文件,只允许写数据

“ab” 追加打开一个二进制文件,并在文件末尾写数据

“rt+” 读写打开一个文本文件,允许读和写

“wt+” 读写打开或建立一个文本文件,允许读写

“at+” 读写打开一个文本文件,允许读,或在文件末追加数 据

“rb+” 读写打开一个二进制文件,允许读和写

“wb+” 读写打开或建立一个二进制文件,允许读和写

“ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据

注:w和a,如果文件不存在,可以创建,而r,如果文件不存在,则返回错误 2. 文件读写操作

size_t fread( void *buffer, size_t size, size_t count, FILE *stream )

参数: buffer 文件读取缓冲区 size 读取数据的类型 count 读取数据的个数 stream 文件指针

返回值:实际读取的数据个数

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

参数: buffer 所要写入文件的缓冲区 size 写入数据的类型 count 写入数据的个数 stream 文件指针

返回值:实际写入的数据个数

程序:

#include <stdio.h>

FILE *stream;

void main( void )

{

long position;

char list[11]={"1278fyjgj"};

char buff[5]="";//数组的大小必须大于读取字符串的大小

int numwritten;

int numread;

if( (stream = fopen( "F:\\c\\文件操作\\file.txt", "w+" )) != NULL )

{

numwritten = fwrite( list, sizeof( char ), 6, stream );

fflush(stream);

printf( "Wrote %d items\n", numwritten );

rewind(stream);//必须重新定位,否则无法从头开始读取 numread=fread(buff,sizeof(char),2,stream); printf("num of read:%d\nThe content of read :%s\n",numread,buff);

}

fclose(stream);

while(1);

}

3. 按固定的格式写入数据函数和按固定格式读出数据函数

int fprintf( FILE *stream, const char *format [, argument ]...)

int fwprintf( FILE *stream, const wchar_t *format [, argument ]...)

参数:stream 文件指针format 按照一定的格式argument 可选参数列表

返回值:

fprintf 返回实际写入的字节数.fwprintf返回实际写入的wchar_t 的字节数

程序:

#include <stdio.h>

FILE *stream;

void main( void )

{

long position;

char s[11]={"1278fyjgj"};

char c='\n';

int i=5;

double fp=1.33;

char buff[5]="";//必须要大于读取字符串的大小

int numwritten;

int numread;

if( (stream = fopen( "F:\\c\\文件操作\\file.txt", "w+" )) != NULL )

{

fprintf( stream, "%s%c", s, c );//文件输入

fprintf( stream, "%d\n", i );

fprintf( stream, "%f\n", fp );

rewind(stream); fread(buff,sizeof(char),3,stream); printf("%s\n",buff);

}

fclose(stream);

while(1);

}

按固定的格式读入数据函数

int fscanf( FILE *stream, const char *format [, argument ]... )

int fwscanf( FILE *stream, const wchar_t *format [, argument ]... )

参数:stream 文件指针format 按照一定的格式argument 可选参数列表

返回值:

fscanf 返回实际读入的字节数.fwscanf返回实际读入的wchar_t 的字节数

如果返回值为 0 则说明没有被赋值

如果有文件结束或是异常的IO错误时 返回 EOF(宏定义)

程序:

#include <stdio.h>

FILE *stream;

struct student

{

int stu_id;

char stu_name[20];

float score[3];

};

void main( void )

{

int i;

struct student

stu[7]={{137,"xiongxiaozhi",{90,87,88}},{136,"wuxiao",{44,66,77}},{135,"shidan",{88,89,90}}}; if( (stream = fopen( "F:\\c\\文件操作\\file.txt", "w" )) != NULL )

for(i=0;i<3;i++)

);

fclose(stream); if( (stream = fopen( "F:\\c\\文件操作\\file.txt", "r" )) != NULL ) for(i=4;i<7;i++) fprintf(stream,"%d %s %f %f %f\n",stu[i].stu_id,stu[i].stu_name,stu[i].score[0],stu[i].score[1],stu[i].score[2]

fscanf(stream,"%d %s %f %f %f\n",&stu[i].stu_id,&stu[i].stu_name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);

]);

fclose(stream);

while(1);

} // fflush(stdin); for(i=4;i<7;i++) printf("%d %-13s %.1f %.1f %.1f\n",stu[i].stu_id,stu[i].stu_name,stu[i].score[0],stu[i].score[1],stu[i].score[2

4. 文件指针搜索函数

int fseek( FILE *stream, long offset, int origin )

参数: stream 文件指针 offset 从当前指针开始的偏移量 origin 文件指针当前的位置 返回值:成功返回0 否则返回非零值

注:指针移动的时候是按字节移动的,要是成功的话 文件的指针将指向当前搜索到的位置 origin 可以的取值在 stdio.h已经定义如下:

SEEK_CUR

当前的文件指针

SEEK_END

文件结束

SEEK_SET

文件的开始

程序:

#include <stdio.h>

FILE *stream;

void main( void )

{

long position;

char s[11]={"1278fyjgj"};

char c='\n';

int i=5;

int result;

double fp=1.33;

char buff[11]="";//必须要大于读取字符串的大小

int numwritten;

int numread;

if( (stream = fopen( "F:\\c\\文件操作\\file.txt", "w+" )) != NULL )

{

fprintf( stream, "The fseek begins here: "

"This is the file 'fseek.out'.\n""xiongxiaozhi" );

result = fseek( stream, 3, SEEK_SET);//文件开头过3个字符

if( result )

printf( "Fseek failed" );

else

{

printf( "File pointer is set to middle of first line.\n" );

fread(buff,sizeof(char),10,stream); printf( "%s\n", buff);

fseek(stream,5,SEEK_CUR);//跳过5个字符

fread(buff,sizeof(char),10,stream);

printf( "%s", buff);

}

}

fclose(stream);

while(1);

}

5. 文件指针重新定位到开始

void rewind( FILE *stream )

参数:stream 文件指针

返回值:无

注:执行完本函数后,文件的指针将返回到开始位置

6. 文件的读取和写入

char *fgets(char *s, int size, FILE *stream);

功能:从文件流读取一行,送到缓冲区,使用时注意以下几点:

返回值:成功时s指向哪返回的指针就指向哪,出错或者读到文件末尾时返回NUL

fgets函数,参数s是缓冲区的首地址,size是缓冲区的长度,该函数从stream所指的文件中读取以'\n'结尾的一行(包括'\n'在内)存到缓冲区s中,并且在该行末尾添加一个'\0'组成完整的字符串。

fgets()函数中,第一个参数指针需要我们事先分配好大小。另外,fgets()函数不适合取二进制的文件,这样,容易发生错误。

注:fgets从指定的文件中读一行字符到调用者提供的缓冲区中,gets从标准输入读一行字符到调用者提供的缓冲区中。

1.当遇到换行符或者缓冲区已满,fgets就会停止,返回读到的数据,值得注意的是不能用fgets读二进制文件,因为fgets会把二进制文件当成文本文件来处理,这势必会产生乱码。

2.每次调用,fgets都会把缓冲区的最后一个字符设为null,这意味着最后一个字符不能用来存放需要的数据,所以如果有一行,含有LINE_SIZE个字符(包括换行符),要想把这行读入缓冲区,请把参数n设为LINE_SIZE+1

3. 由结论1可推出:给定参数n,fgets只能读取n-1个字符(包括换行符),如果有一行超过n-1个字符,那么fgets返回一个不完整的行,也就是说,只读取该行的前n-1个字符,但是,缓冲区总是以null字符结尾,对fgets的下一次调用会继续读该行。

注意,对于fgets来说,'\n'是一个特别的字符,而'\0'并无任何特别之处,如果读到'\0'就当作普通字符读入。如果文件中存在'\0'字符(或者0x00字节),调用fgets之后就无法判断缓冲区中的'\0'究竟是从文件读上来的字符还是由fgets自动添加的结束符,所以fgets只适合读文本文件而不适合读二进制文件,并且文本文件中的所有字符都应该是可见字符,不能有'\0'。

#include <stdio.h>

int fputs(const char *s, FILE *stream);

int puts(const char *s);

返回值:成功返回一个非负整数,出错返回EOF

fputs向指定的文件写入一个字符串,puts向标准输出写入一个字符串。

缓冲区s中保存的是以'\0'结尾的字符串,fputs将该字符串写入文件stream,但并不写入结尾的'\0'。与fgets不同的是,fputs并不关心的字符串中的'\n'字符,字符串中可以有'\n'也可以没有'\n'。puts将字符串s写到标准输出(不包括结尾的'\0'),然后自动写一个' \n'到标准输出。

其他:

1:删除文件:remove(文件指针)

2:重命名:rename(旧文件名,新文件名)

3:获取文件的当前读写位置:ban=ftell(文件指针)

4:检验文件指针是否到达文件末尾:feof(文件指针)

如果返回为非0,说明文件指针到达文件末尾,否则返回为0

5:检验文件的错误状态:ferror(文件指针)

如果函数返回非0,说明对当前文件操作出错,否则说明当前操作正常

6:清除错误标志:clearerr(文件指针)

 

第二篇:C#文件操作总结

C#文件操作总结

20xx-07-03 09:48:30| 分类: C#杂七杂八 |字号大中小订阅

1.1文本文件的读写

FileStream f=new FileStream("1.txt",FileMode.Create);//创建一个1.txt

FileStream f=new FleStream("1.txt",FileMode.Open);//打开一个1.txt

//读取文件

StramReader m=new StreamReader(f);

string s="";

While(!m.EndOfStream) //判断文本文件是否到流的末尾

{

s+=m.ReadLine();

}

m.Close();

f.Close();

//写入文件

StreamWriter n=new StreamWriter(f);

string s="";

n.Write(s); //s可以为double/int /char/string类型

n.Close();

f.Close();

1.2二进制文件流读写

FileStream f=new FleStream("1.txt",FileMode.Open);//打开一个1.dat

//二进制文件读取

BinaryReader m=new BinaryReader(f);

m.ReadBoolean(); //读取bool类型值

m.ReadInt32(); //ReadInt64()/ReadString()

m.Close();

f.Close();

//写入文件

string s=""; //s可以为double/int /char/string类型

BinaryWriter n=new BinaryWriter(f);

n.Write(s);

n.Close();

f.Close();

1.3File类的文件操作及文件信息获取

bool s=File.Exists("1.txt"); //判断文件是否存在bool

File.Move(path1,path2); //将文件从path1移动到path2

File.Copy(path1,path2); //将文件从path1拷贝到path2

File .Delete("1.txt");//删除文件

DateTime d= File.GetCreationTime ("1.txt");//获取文件创建时间

DateTime d=File .GetLastAccessTime ("1.txt");//获取上次访问文件的日期和时间

DateTime d=File .GetLastWriteTime ("1.txt");//获取上次修改文件的日期和时间

//修改时间

DateTime d=DateTime .Now ;

File .SetCreationTime ("1.txt",d);//设置文件创建时间

File .SetLastAccessTime ("1.txt",d);//设置文件上次修改时间

File .SetLastWriteTime ("1.txt",d);//设置文件上次写入时间

1.4FileInfo 类的文件操作

FileInfo类的文件操作

FileInfo类提供的许多方法类似于File类的方法,但是File类是静态类,这是不同之处。FileInfo aFile = new FileInfo("1.txt");

if (aFile.Exists) //判断文件是否存在

{

Console.WriteLine("File Exist!");

}

string s = aFile.FullName;//获得文件完整路径

string s = aFile.Name;//获得文件完整路径

string s = aFile.Extension;//获得文件扩展名

string s = aFile.DirectoryName;//获得文件目录的路径

int len = aFile.Length;//获得文件的容量

bool s = aFile.IsReadOnly;//判断文件是否只读

DateTime d = aFile.LastAccessTime;//获得文件最后访问时间

DateTime d = aFile.LastWriteTime;//获得文件最后写入时间

1.5 Directory类文件操作

Directory类也是静态类,主要函数如下操作:

string s = "D://FileDocument";

string src="D://3";

string dst="D://FileDocument//";

Directory.CreateDirectory(s);//在D盘创建文件夹FileDocument

Directory.Delete(s);//删除D盘FileDocument文件夹,该文件夹必须可写或为空

string[] num = Directory.GetDirectories(s);//返回D盘FileDocument 文件夹内所有文件夹的路径数组string[],即目录名数组

string[] nm = Directory.GetFiles(s);//返回D盘FileDocument文件夹内所有文件的路径数组string[],不包括文件夹目录

string[] numS = Directory.GetFileSystemEntries(s);//返回D盘FileDocument文件夹内所有文件及目录的路径数组string[]

Directory.Move(src, dst);//把D盘文件3重命名为D盘文件FileDocument,该文件之前不可存在,执行该命令时重建

注意:DirectoryInfo类作用类似于FileInfo类,是一个实例化的对象

1.5FileStream读取文件操作

FileStream可以读取任何文件,包括声音和视频文件,但是只能处理原始字节,即,只能把文件内容保存在一个byte[]数组中,不过我们可以通过几种转换类可以很容易的将字节数组转换为字符数组,或将字符数组转换为字节数组。

byte[] byData = new byte[100];

char[] charData = new char[100];

FileStream aFile=new FileStream ("1.dat",FileMode .Open );

aFile.Seek(100, SeekOrigin.Begin);//从文件开头开始,将文件指针偏移100个字节

aFile.Read(byData, 0, 100);//从当前指针位置,读取100个字节到byData数组中

Decoder d = Encoding.UTF8.GetDecoder();

d.GetChars(byData, 0, byData.Length, charData, 0);//在byData中索引为0的位置开始,读取byData长度的字节数到字节数组charData中,位置是从charData的0索引位置开始

byData = Encoding.UTF8.GetBytes(charData);//将字符数组转换为字节数组

aFile .Seek (0, SeekOrigin.Begin );//把指针位置偏移到文件开头

aFile.Write(byData, 0, byData.Length);//把byData数组内容写入文件中,开始位置为0索引处

相关推荐