c语言读 写文件使用哪个参数,C语言文件读写操作

C语言中对文件的操作主要是数据流。下面主要说明以下几个方面,文件的基本概念、文件类型指针、文件基本操作。

文件的基本概念

文件是程序设计中的一个重要概念。所谓“文件”一般指存储在外部介质上数据的集合。我们将数据的输入输出形象地称为“流”,即数据流,它表示了数据从源到目的端的流动。

文件名和文件路径 D:\CC\temp\file.txt

根据数据的组织形式,数据文件可分为ASCII文件(即文本文件)和二进制文件。数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件。如果要求在外存上以ASCII代码形式存储,则需要在存储前进行转换。

文件类型指针

每个被使用的文件都需要在内存中开辟一个相应的文件信息区,用来存放文件的相关信息。这些信息保存在一个结构体变量中,该结构体类型是由系统声明的,取名为FILE,包含在头文件“stdio.h”中。

在对文件进行操作之前,首先要设置一个指向FTIL类型变量的指针变量,然后通过它来引用这些FILE类型变量。通过文件指针变量能够找到与它相关联的文件。

下面定义了一个指向文件型数据的指针变量:

FILE * fp;

文件基本操作

fopen(打开文件)   fclose  (关闭文件)

定义函数   FILE * fopen(const char * path,const char * mode);

函数说明:  参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态,若取值为rb,表示 以二进制读取方式打开文件,该文件必须存在。一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen后请作错误判断及处理。

例:

FILE * fp;

fp = fopen( “a1.txt”, “r”);

……

fclose(fp);

所谓“打开”文件是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。

所谓“关闭”文件是指撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件。

文件打开方式

含义

如果文件不存在

"r"(只读)

为输入打开一个文本文件

出错

"w”(只写)

为输出打开一个文本文件

建立新文件

"a"(追加)

向文本文件尾添加数据

出错

"rb"(只读)

为输入打开一个二进制文件

出错

"wb"(只写)

为输出打开一个二进制文件

建立新文件

"ab"(追加)

向二进制文件尾添加数据

出错

"r+"(读写)

为读写打开一个文本文件

出错

"w+"(读写)

为读写建立一个新的文本文件

建立新文件

"a+"(读写)

为读写打开一个文本文件(追加)

出错

"rb+"(读写)

为读写打开一个二进制文件

出错

"wb+"(读写)

为读写建立一个新的二进制文件

建立新文件

"ab+"(读写)

为读写打开一个二进制文件(追加)

出错

读写一个字符和一个字符串

函数名

调用形式

功能

返回值

fgetc

fgetc(fp)

从fp指向的文件读入一个字符

读成功,带回所读的字符,失败则返回文件结束标志EOF(即-1)

fputc

fputc(ch, fp)

把字符ch写到文件指针变量fp所指向的文件中

输出成功,返回值就是输出的字符;输出失败,返回EOF

fgets

fgets(str, n, fp)

从fp指向的文件读入一个长度为(n-1)的字符串,存放到字符数组str中

读成功,返回地址str,失败则返回NULL

fputs

fputs(str, fp)

把str指向的字符串写到文件指针变量fp指向的文件中

输出成功,返回0;否则返回非0值

用二进制方式向文件读写一组数据

fread(从文件流读取数据)

定义函数

size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明

fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。

返回值

返回实际读取到的nmemb数目。

fwrite(将数据写至文件流)

定义函数

size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明

fwrite()用来将数据写入文件流中。

参数stream为已打开的文件指针,参数ptr 指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。

返回值

返回实际写入的nmemb数目。

fread和fwrite的一般调用形式为:

fread( buffer, size, count, fp)

fwrite ( buffer, size, count, fp)

其中:

buffer是一个地址,对于fread来说,它是用来存放从文件读入的数据的存储区的地址;对于fwrite来说,是要把此地址开始的存储区中的数据向文件输出。size是要读写的字节数。count是要读写多少个数据项(每个数据项长度为size)。fp是FILE类型的文件指针。

用格式化的方式读写文件:

fprintf(文件指针,格式字符串,输出表列);

fscanf(文件指针,格式字符串,输入表列);

fseek(移动文件流的读写位置)

定义函数

int fseek(FILE * stream,long offset,int whence);

函数说明

fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。

参数

whence为下列其中一种:

SEEK_SET从距文件开头offset位移量为新的读写位置。

SEEK_CUR 以目前的读写位置往后增加offset个位移量。

SEEK_END将读写位置指向文件尾后再增加offset个位移量。

当whence值为SEEK_CUR 或SEEK_END时,参数offset允许负值的出现。

下列是较特别的使用方式:

1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);

2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,SEEK_END);

ftell(取得文件流的读取位置)

定义函数

long ftell(FILE * stream);

函数说明

ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。

返回值

当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。

代码展示

#include

#include

int main()

{

FILE * fp = NULL;

fp = fopen("1.txt","rb");

if(NULL == fp)

{

printf("文件打开错误!\n");

system ("pause");

}

//fgetc 读一个字符

char ch ='\0';

ch=fgetc(fp);

printf("文件的第一个字符是:%c\n", ch);

//fgets 读一个字符串

fseek(fp,0, SEEK_SET);

char s[100] ="\0";

fgets(s,100,fp);

printf("第一行的内容是:%s\n", s);

printf("第一行的长度是:%d\n", strlen(s));//其中回车是/n /r /n换行 /r移动到开头

//fread 读写整个内存块

fseek(fp, 0,SEEK_END);

int len = 0;

len = ftell(fp);//ftell 计算指针位置

char * buffer = NULL;

buffer = (char*)malloc(len + 1);

memset(buffer, 0x00, len + 1);//长度为len+1大小的指针内存空间

fseek(fp, 0,SEEK_SET);//把文件流的指针移动到开头

fread(buffer, len, 1,fp);//数组名也是一个地址 其他变量要取地址符

printf("文件的内容是: \n%s\n",buffer);

fclose(fp);//关闭文件

//定义一个新的文件指针,这里我们还是用fp

fp = NULL;

//以wb的方式打开2.txt

fp = fopen("2.txt","wb");

//判断文件打开是否成功,给出提示

if(NULL == fp)

{

printf("文件打开错误!\n");

system ("pause");

}

//fputc 写一个字符

fputc(ch,fp);

//fputs 写一串字符串

fputs(s,fp);

//fwrite 写一整个文件内容

fwrite(buffer,len,1,fp);

fclose(fp);//关闭文件

free(buffer);//释放动态分配的内存空间

return 0;

}

注:运行代码前在目录下创建个1.txt,为了和截图实验效果一样,在里面写如下内容:

ABCDEF

GHIJKLM

效果图:

75dd46bdd7b5fc82223dcd81e08c05e6.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值