c文件操作

c语言里面的各种字符/字符串读写一直搞得我分不清楚。。今天来学习总结一下:
原文章来自http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html
http://sodino.com/2015/03/07/c-file-io/

打开(读写)文件

1.函数原型

FILE *fopen(char *pname,char *mode)

 2.功能说明
   按照mode 规定的方式,打开由pname指定的文件。若找不到由pname指定的相应文件,就按以下方式之一处理:
(1) 此时如mode 规定按写方式打开文件,就按由pname指定的名字建立一个新文件;
(2) 此时如mode 规定按读方式打开文件,就会产生一个错误。

打开文件的作用是:
(1)分配给打开文件一个FILE 类型的文件结构体变量,并将有关信息填入文件结构体变量;
(2)开辟一个缓冲区;
(3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;
FILE *:指出fopen是一个返回文件类型的指针函数;

3.参数说明
pname:是一个字符指针,它将指向要打开或建立的文件的文件名字符串。
mode:是一个指向文件处理方式字符串的字符指针,指出打开的方式:


补充:
t:text文本文件
b:二进制文件
各种模式可以组合:
rt,rt+,wt,rb,wb,at,ab。。。

//举例说明:
    FILE *fin, *fout;
    fin = fopen("text1.txt", "r");
    if (!fin)
        printf("open file 1 failed! \n");
    fout = fopen("text2.txt", "w");
    if (!fopen)
        printf("open file2 failed! \n");

4.返回值
   正常返回:被打开文件的文件指针。
   异常返回:NULL,表示打开操作不成功。
5,要说明的是:C语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSI C标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准出错 stderr。

关闭文件

要注意的是读写完成后一定要记得关闭文件否则数据可能没保存

1. 函数原型

int fclose(FILE *fp);
2. 功能说明
  关闭由fp指出的文件。此时调用操作系统提供的文件关闭功能,关闭由fp->fd指出的文件;释放由fp指出的文件类型结构体变量;返回操作结果,即0或EOF。

3. 参数说明
  fp:一个已打开文件的文件指针。

4. 返回值
  正常返回:0。
  异常返回:EOF,表示文件在关闭时发生错误。
例如:

int n=fclose(fp);

//当然也不一定要检测,可以直接写出来:
    fclose(fin);
    fclose(fout);

具体的读写函数

A. 从文件中读取一个字符
  1. 函数原型

int fgetc(FILE *fp);

  2. 功能说明
    从fp所指文件中读取一个字符。
  3. 参数说明
    fp:这是个文件指针,它指出要从中读取字符的文件。
  4. 返回值
    正常返回: 返回读取字符的代码。
    非正常返回:返回EOF。例如,要从”写打开”文件中读取一个字符时,会发生错误而返回一个EOF。
  5. 实例
  

    ch = fgetc(fin);
    while (ch != EOF)
    {
        putchar(ch);
        ch = fgetc(fin);//也就是说这个期间文件指针fp一直在移动
    }

B. 写一个字符到文件中去

1. 函数原型

int fputc(int ch,FILE *fp)

2. 功能说明
  把ch中的字符写入由fp指出的文件中去。
3. 参数说明
  ch:是一个整型变量,内存要写到文件中的字符(C语言中整型量和字符量可以通用)。
  fp:这是个文件指针,指出要在其中写入字符的文件。
4. 返回值
  正常返回: 要写入字符的代码。
  非正常返回:返回EOF。例如,要往”读打开”文件中写一个字符时,会发生错误而返回一个EOF。
5. 实例

//将in指向的文件复制到out指向的文件中去
    ch=fgetc(in); //从in所指文件的当前指针位置读取一个字符
    while(ch!=EOF) //判断刚读取的字符是否是文件结束符
    {
        fputc(ch,out); //若不是结束符,将它写入out所指文件
        ch=fgetc(in); //继续从in所指文件中读取下一个字符
    } //完成将in所指文件的内容写入(复制)到out所指文件中
    fclose(in); //关闭in所指文件
    fclose(out); //关闭out所指文件

字符串:

C. 从文件中读取一个字符串

1. 函数原型
  

char *fgets(char *str,int szie,FILE *fp)

2. 功能说明
  从由fp指出的文件中读取n-1个字符,并把它们存放到由str指出的字符数组中去,最后加上一个字符串结束符’\0’。
3. 参数说明
  str:接收字符串的内存地址,可以是数组名,也可以是指针。
  n: 指出要读取字符的个数。
  fp:这是个文件指针,指出要从中读取字符的文件。
4. 返回值

正常返回:返回字符串的内存首地址,即str的值。
非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要从”写打开”文件中读取字符串,将
发生错误而返回一个NULL值。

D. 写一个字符串到文件中去

1. 函数原型

int fputs(char *str,FILE *fp)

2. 功能说明
  把由str指出的字符串写入到fp所指的文件中去。
3. 参数说明
  str:指出要写到文件中去的字符串。
  fp:这是个文件指针,指出字符串要写入其中的文件。
4. 返回值
  正常返回: 写入文件的字符个数,即字符串的长度。
  非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要往一个”读打开” 文件中写字符串时,会发生错误而返回一个NULL值。

//example:将一个文件的内容以追加形式添加到另一个文件
#include <stdio.h>
#define SIZE 512
void main()
{
    char buffer[SIZE];
    FILE *fp1, *fp2;

    // 按追加方式打开argv[1] 所指文件
    if ((fp1 = fopen("text1.txt", "a")) == NULL)
    {
        printf("The file text1 can not be opened.\n");
        return;
    }
    if ((fp2 = fopen("text.txt", "r")) == NULL)
    {
        printf("The file text can not be opened.\n");
        return;
    }
    // 读入一行立即写出,直到文件结束
    while (fgets(buffer, SIZE, fp1) != NULL)
        printf("%s\n", buffer);
    while (fgets(buffer, SIZE, fp2) != NULL)
        fputs(buffer, fp1);
    fclose(fp1);
    fclose(fp2);
    if ((fp1 = fopen("text1.txt", "r")) == NULL)
    {
        printf("The file text1,line28 can not be opened.\n");
        return;
    }
    while (fgets(buffer, SIZE, fp1) != NULL)
        printf("%s\n", buffer);
    fclose(fp1);
}
  • 关于feof()函数
    1. 函数原型

int feof(FILE *fp)
2. 功能说明
   在文本文件(ASCII文件)中可以用值为-1的符号常量EOF来作为文件的结束符。但是在二进制文件中-1往往可能是一个有意义的数据,因此不能用它 来作为文件的结束标志。为了能有效判别文件是否结束,ANSI C提供了标准函数feof(),用来识别文件是否结束。
3. 参数说明
  fp:文件指针。
4. 返回值
  返回为非0值:已到文件尾。
  返回为0值:表示还未到文件尾。
* 关于exit()函数
1. 函数原型

void exit(int status)
2. 功能说明
  exit()函数使程序立即终止执行,同时将缓冲区中剩余的数据输出并关闭所有已经打开的文件。
3. 参数说明
  status:为0值表示程序正常终止,为非0值表示一个定义错误。
4. 返回值
  无。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值