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;
}
}
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);