C:文件操作

0.文件的输入输出

  • 文件输入:scanf()+命令行重定向<
./a.out < xxx.txt
#include <stdio.h>

// printf()写入文件 ./a.out > XXXX.txt 
// scanf()从文件读  ./a.out < XXXX.txt

int main(){
        char name[20];
        scanf("%s",name);
        printf("Hello %s!\n",name);
}
文件输入
  • 文件输出:printf()+命令行重定向>
./a.out > xxx.txt
文件输出
  • 每次执行上次操作会覆盖掉原有数据


    多次文件输入输出
  • 命令行重定向追加写入>>

  • 只能写入printf()

    追加写入

  • scanf()从终端通过管道中读取数据

通过管道读取数据

1.文件打开fopen()、关闭fclose()

1.1 打开文件:fopen()

  • 函数
FILE *fopen(const char *pathname, const char *mode);
// const char *pathname // 文件路径
//  const char *mode // 文件打开方式
  • 一些文件打开方式的组合
No 文件打开方式 含义
1 r 以只读的方式打开文件,前提是这个文件必须存在(只写 r 默认是文本文件.txt
2 r+ 以可读可写的方式打开文件,前提是这个文件必须存在(默认是文本文件)。
3 rb 以只读的方式打开一个二进制文件,前提是这个文件必须存在。
4 rb+ 以可读可写的方式打开一个二进制文件,前提是这个文件必须存在。
5 w 以只写的方式打开文件,如果这个文件不存在,就创建这个文件;如果这个文件存在,则清空内容。
6 w+ 以可读可写的方式打开文件,如果这个文件不存在,就创建这个文件;如果这个文件存在,则清空内容。
7 wb 以只写的方式打开一个二进制文件,如果这个文件不存在,就创建这个文件;如果这个文件存在,则清空内容。
8 wb+ 以可读可写的方式打开一个二进制文件,如果这个文件不存在,就创建这个文件;如果这个文件存在,则清空内容。
9 a 以追加的方式打开只写文件,如果这个文件不存在,就创建这个文件;如果这个文件存在,则在文件尾部追加内容。
10 a+ 以追加的方式打开一个可读可写的文件,如果这个文件不存在,就创建这个文件;如果这个文件存在,则在文件尾部追加内容。
11 ab 以追加的方式打开一个二进制只写文件,如果这个文件不存在,就创建这个文件;如果这个文件存在,则在文件尾部追加内容。
12 ab+ 以追加的方式打开一个二进制可读可写文件,如果这个文件不存在,就创建这个文件;如果这个文件存在,则在文件尾部追加内容。
  • 例:以只读的方式打开文件
FILE* pfile = fopen("./student_info.txt","r");
  • 例:以只写的方式打开二进制文件
const char* path = "./student_info3.dat";
FILE* pfile = fopen(path,"wb");
  • 返回值
    文件打开成功:指向这个文件流的文件指针;
    文件打开失败:NULL

1.2 关闭文件fclose()

函数:

int fclose(FILE *stream);
// FILE *stream 文件指针

例:

fclose(pfile);
pfile = NULL;
  • 返回值
    文件关闭成功:0
    文件关闭失败:EOF(-1)

2.文本读fscanf()fprintf()

  • 函数
int fprintf(FILE *stream, char *format, argument...);
int fscanf(FILE *stream, char *format, argument... );
  • 例:从文本中将m读入
int m;
fscanf(pfile,"%d",&m);
  • 例:将n写入文本
int n;
fprintf(pfile,"%d\n",n);

3.二进制的读fread()fwrite()

  • 函数
size_t fread(void *ptr, size_t size, size_t count, FILE* stream);
size_t fwrite(void *ptr, size_t size, size_t count, FILE* stream);
// void *ptr // 指针 指向需要传入的数据的地址
// size_t size // 传入数据的大小
// size_t count // 传入数据的个数
// FILE* stream // 文件指针
  • 例:从文件中读入一个int型变量
int m;
fread(&m,sizeof(m),1,pfile);
  • 例:将一个int型变量写入文件
int m;
fwrite(&m,sizeof(m),1,pfile);

4.文件定位ftell()fseek()

  • 函数
// 获取位置
long ftell(FILE* stream);
// 设置位置
int fseek(FILE* stream,long offset,int whence);
// offset 偏移量 基于起始点偏移了offset个字节
// whence 起始点 
// SEEK_SET 0 - 从头开始
// SEEK_CUR 1 - 从当前开始
// SEEK_END 2 - 从结束开始
  • 例:获取文件大小
#include<stdio.h>

// ./a.out file_path
int main(int argc,char** argv){
        // 判断输入是否正确
        if(1 == argc){
                printf("error:no argument\n");
                printf("Usage: %s file_path\n",argv[0]);
                return 1;
        }
        // 判断文件是否打开成功
        for(int i=0;i<argc;i++){
                // 文件指针
                // 只读的方式打开文件
                FILE* pfile = fopen(argv[i],"r");
                if(NULL == pfile){
                        printf("%s open failed\n",argv[i]);
                        return 1;
                }
                // 获取文件大小
                fseek(pfile,0,SEEK_END);
                printf("%s %d\n",argv[i],ftell(pfile));
                fclose(pfile);
                pfile = NULL;
        }
}
4 结果

5.文件结尾判断feof()

  • 函数
int feof(FILE* stream);
  • 返回值
    文件指针指向文件结尾返回真值;否则返回非真值。

6.返回开头rewind()

  • 函数
代码块

7.清空数据流fflush()

  • 函数
void rewind(FILE* stream);

8.文件重命名rename()、文件删除remove()

  • 函数
int rename(const char *old_filename, const char *new_filename);
int remove(char * filename);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容