C语言常见文件操作

文件操作指针

  • FILE *fp
  • fp变量具有指向文件内存的功能,即可以直接操作文件
  • 注:访问文件不只可以用指针 还可以用文件流指针和文件操作符

1.1 fopen函数

  • 对一个文件操作时一定需要先打开文件,即需要使用fopen函数
#include <stdio.h>

int main(){
    FILE * fp1,*fp2;
    fp1 = fopen("text_1.c","r");//fopen包含两个参数,第一个文件名 ,第二个为以什么方式打开
    if ((fp1 = fopen("text_1","r")) == NULL){//如果调用成功则fp指向text_1.c,如果不成功则返回NULL
        printf ("error");
        exit(0);
    }
}

注:fopen第一个参数一定要加后缀名,如何操作的函数不在当前文件夹需要加上路径名
附:一些常见的模式

模式释意
“r”为读而打开文本文件.(不存在则出错)
“rb”为读而打开二进制文件.
“w”为写而打开文本文件.(若不存在则新建,反之,则从文件起始位置写,原内容将被覆盖)
“wb”为写而打开二进制文件.
“a”为在文件后面添加数据而打开文本文件.(若不存在,则新建;反之,在原文件后追加)
“ab”为在文件后面添加数据而打开一个二进制文件
“r+”为读和写而打开文本文件.(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变)
“rb+”为读和写而打开二进制文件.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
“w+”首先建立一个新文件,进行写操作,随后可以从头开始读.(若文件存在,原内容将全部消失)
“wb+”功能与"w+"同.只是在随后的读写时,可以由位置函数设置读和写的起始位置.

最常用的文件使用方式及其含义如下:
“a+”|功能与"a"相同;只是在文件尾部添加新的数据后,可以从头开始读.
“ab+”|功能与"a+"相同;只是在文件尾部添加新数据之后,可以由位置函数设置开始读的起始位置.

1.2 fclose函数

  • 对一个文件操作结束需要关闭指向该文件的指针变量
  • 格式:fcloes(文件指针名);

1.3 fgetc函数

  • 从文件指针指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节
  • 格式:fgetc(文件指针名);

1.4 fputc函数

  • 将一个字符写到文件指针所指向的文件的当前写指针的位置
  • 格式:fputc(变量名/单个字符,文件指针名);

1.5 feof函数

  • 判断文件是否结束
  • EOF可以判断文本文件是否结束 但不能判断二进制文件是否结束
    原因:二进制文件中,信息都是以数值方式存在的。EOF的值可能就是所要处理的二进制文件中的信息
    注:EOF为一个宏 其值为-1
  • feof()的原理:
    feof()函数,并不是通过读取到文件的EOF来评判,这个文件是否为空。
    对feof()来说,它的工作原理是,站在光标所在位置,向后看看还有没有字符。如果有,返回0;如果没有,返回非0。它并不会读取相关信息,只是查看光标后是否还有内容。
    直接使用时的错误分析:
    对于一个空文件来说,当程序打开它的时候,它的光标会停在文件的开头,但是由于文件里什么内容都没有存(但是EOF是存在的),即整个文件就存贮了一个EOF。当程序打开文件,并直接调用feof()时,这个函数就会站在光标的位置向后张望,结果就看见了EOF,然后就当然返回0了。
    正确用法:
#include<stdio.h>
int main(void)
{
    FILE *p;
    p = fopen("open.txt", "r");
    getc(p); //获取一个字符 若为空文件则将光标移到EOF后
    if (feof(p))
    {
        printf("文件为空。");
    }
    else
    {
        rewind(p);//将光标跳回到文件开头
    }
    return 0;
 }

1.6fscanf函数

  • 从文件读取数据并存储到变量中
  • 格式:fscanf(文件指针,格式字符串,输入表列)

1.7fprintf函数

  • 输出数据到文件中
  • 格式:fprintf(文件指针,格式字符串,输出表里)

1.8fread函数

  • 用二进制方式直接将磁盘文件中若干字节读取到内存中
  • 格式:fread(变量地址,字节长度,需要读取的字节数量,文件指针)

1.9fwrite函数

  • 用二进制方式直接将内存的一组数据原封不动不加转换地复制到磁盘文件上
  • 格式:fread(变量地址,字节长度,需要读取的字节数量,文件指针)

2.0rewind函数

  • 使文件标记位置指向文件开头
  • 格式rewind(文件指针)

2.1fseek函数

  • 改变当前文件标记位置
  • 格式fseek(文件指针,位移量,起始点)
    注:
    文件开始位置:SEEK_SET 0
    文件当前位置:SEEK_CUR 1
    文件末尾位置:SEEK_END 2

2.2ftell函数

  • 得到流式文件位置标记的当前位置
  • 格式ftell(文件指针)
    注:错误返回值为-1L

2.3ferror函数

  • 在调用各种输入输出函数时,如果出现错误,除了函数返回值有反映外还可以用ferror检测
  • 格式ferror(文件指针)
    注:返回值为0即为假,表示未出错,非零值则表示出错

2.4clearerr函数

  • 清除文件错误标志
  • 格式:clearerr(文件指针)

附:
1.遍历文件内容并打印到屏幕上

#include <stdio.h>

int main (){
    FILE *fp1;
    char ch;
    fp1 = fopen("/Users/baifeng/code/filesock/main.cpp","r+");
    
  
     while (ch != EOF)
     {
        ch = fgetc(fp1);
        printf("%c",ch);

     }
    
    fclose(fp1); 
   
    return 0;
    
}

2.遍历文件内容并复制到另一个文件中

#include <stdio.h>
#include <stdlib.h>

int main (){
    FILE *fp1,*fp2;
    char ch;
    fp1 = fopen("/Users/baifeng/code/filesock/main.cpp","r+");
    fp2 = fopen("/Users/baifeng/code/testfile2.c","r+");
  
     if(( fp1 = fopen("/Users/baifeng/code/filesock/main.cpp","r+")) == NULL){
        printf("Open file error");
        exit(1);
     }
     else
     {
         while (ch != EOF)
        {
            ch = fgetc(fp1);
            fputc(ch,fp2);

        }
     }
     
    fclose(fp1); 
    fclose(fp2);
    return 0;
    
}//复制完后,fp2指向的文件后面出现""?"暂未解决

3.将文件里面的值赋予变量

#include <stdio.h>
#include <stdlib.h>
int main(){
    FILE *fp1,fp2;
    int a;
    char b[20];
    int c;
    fp1 = fopen("/Users/baifeng/code/test_1.txt","r+");
    
    if ((fp1 = fopen("/Users/baifeng/code/test_1.txt","r+")) == NULL){
        printf("Open file error");
        exit(1);
    }
    
    else
    {
        fscanf(fp1,"%d %s %d",&a,b,&c);
        printf("%d,%s,%d",a,b,c);
    }
    return 0;
       
}

4.将变量的值输入到文件中

#include <stdio.h>
#include <stdlib.h>

int main(){
    FILE *fp1;

    int i =10;
    fp1 = fopen("test_1.txt","r+");

    if ((fp1 = fopen("test_1.txt","r+")) == NULL)
    {
        printf("open file error");
        exit(1);
    }
    else
    {
        fprintf(fp1,"%d",i);
    }
    
    
    return 0;
}

5.计算文件长度

#include <stdio.h>
#include <stdlib.h>

int main(){
    FILE *fp1;
    int i;
    fp1 = fopen("/Users/baifeng/code/testfile2.c","r+");
    fseek(fp1,SEEK_SET,SEEK_END);
    i = ftell(fp1);
    rewind(fp1);
    printf("文件长度为%d\n",i);
}

6.将一个文件内容复制到另一个文件中

#include <stdio.h>
#include <stdlib.h>

int main(){
    FILE *fp1,*fp2;
    char ch[200];
    fp1 = fopen("/Users/baifeng/code/testfile3.c","r+");
    fp2 = fopen("/Users/baifeng/code/testfile4.c","r+");
    if ((fp1 = fopen("/Users/baifeng/code/testfile3.c","r+"))==NULL||fp2 = fopen("/Users/baifeng/code/testfile4.c","r+")==NULL){
        printf("open file error");
        exit(1);
    }
    else{
        fread(ch,1,200,fp1);
        fwrite(ch,1,200,fp2);
    }
    return 0;
    
}

参考博客:
https://blog.csdn.net/rznice/article/details/7208992
https://blog.csdn.net/weibo1230123/article/details/79110542
https://blog.csdn.net/konghouy/article/details/80530937

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值