文件的打开和关闭
fopen
函数原型:
FILE *fopen( const char *filename, const char *mode );
const char *filename
文件的路径以及名字const char *mode
文件的打开方式
文件打开方式 | 含义 | 如果文件不存在 |
---|---|---|
“r” | 读 | 文件不存在会报错 |
“w” | 写(清空写) | 建立一个新的文件 |
“a” | 写(追加写) | 建立一个新的文件 |
“r+” | 读写 | 文件不存在会报错 |
“w+” | 读写(清空写) | 建立一个新的文件 |
“a+” | 读写(追加写) | 建立一个新的文件 |
“rb” | 读二进制文件 | 文件不存在会报错 |
“wb” | 写二进制文件(清空写) | 建立一个新的文件 |
“ab” | 写二进制文件(追加写) | 建立一个新的文件 |
“rb+” | 读写二进制文件 | 文件不存在会报错 |
“wb+” | 读写二进制文件(清空写) | 建立一个新的文件 |
“ab+” | 读写二进制文件(追加写) | 建立一个新的文件 |
FILE *fopen
返回一个指向FILE
类型数据的指针变量,通过FILE*
指针指向某个文件的信息区(是一个结构体变量),通过文件信息区就能够访问该文件。如果打开失败返回NULL
指针
注:使用 "w" 的方式打开文件,会将文件中的内容清空在写。当你使用 "w"的方式打开文件,但是不写任何内容,有清空文件的效果。
文件路径的两种书写方式:
1.使用反斜杠 \
会使后面的字符转义,所以需要使用 \\
两个反斜杠代表一个斜杠。
FILE* fp = fopen("D:\\test.txt" , "w");
2.使用 /
就不需要考虑转义字符的问题了。
FILE* fp = fopen("D:/test.txt", "w");
fclose
函数原型:
int fclose( FILE *stream );
FILE *stream
指向文件流的指针int fclose
关闭成功返回0
关闭失败返回EOF
例1:
#include <stdio.h>
#include <stdlib.h>
int main() {
// 打开文件
//FILE* fp = fopen("D:\\test.txt" , "w");
FILE* fp = fopen("D:/test.txt", "w");
if (fp == NULL) {
perror("fopen:");
exit(-1);
}
// 文件操作
// ...
// 关闭文件
fclose(fp);
fp = NULL;
return 0;
}
文件的顺序读写
功能 | 函数名 | 适用于 |
---|---|---|
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
字符串输入函数 | fgets | 所有输入流 |
字符串输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件流 |
二进制输出 | fwrite | 文件流 |
stdin
标准输入流(键盘),stdout
标准输出流(屏幕)。
1.fgetc
函数原型:
int fgetc( FILE *stream );
FILE *stream
输入流int fgetc
返回该字符的ASCII
值,失败或文件结束返回EOF
。
例:
#include <stdio.h>
int main() {
FILE* fp = fopen("D:/test.txt", "r");
if (fp == NULL) {
perror("fopen:");
exit(-1);
}
char ch = fgetc(fp);
putchar(ch);
fclose(fp);
fp = NULL;
return 0;
}
2.fputc
函数原型:
int fputc( int c, FILE *stream );
int c
输出的字符FILE *stream
输出流int fputc
返回该字符的ASCII
值,失败返回EOF
。
例:
#include <stdio.h>
int main() {
FILE* fp = fopen("D:/test.txt" , "w");
if (fp == NULL) {
perror("fopen:");
exit(-1);
}
fputc('a' , fp);
fclose(fp);
fp = NULL;
return 0;
}
注:fgetc(stdin) == getchar(); fputc('a' , stdout) == putchar('a');
3.fputs
函数原型:
int fputs( const char *string, FILE *stream );
const char *string
输出的字符串FILE *stream
输出流int fputs
成功返回非负的值,失败返回EOF
例:
#include <stdio.h>
int main() {
FILE* fp = fopen("D:/test.txt" , "w");
if (fp == NULL) {
perror("fopen:");
exit(-1);
}
fputs("abcdefg" , fp);
fclose(fp);
fp = NULL;
return 0;
}
4.fgets
函数原型:
char *fgets( char *string, int n, FILE *stream );
char *string
这是指向一个字符数组的指针,用来存放读取到的字符串。int n
最大读到字符个数,包含'\0'
,实际读到n-1
个字符FILE *stream
输入流char *fgets
如果成功返回读取到字符串的首元素地址,失败或者文件结束返回EOF
例:
#include <stdlib.h>
#include <stdio.h>
int main() {
FILE* fp = fopen("D:/test.txt", "r");
if (fp == NULL) {
perror("fopen:");
exit(-1);
}
char buffer[256] = { 0 };
char * res = fgets(buffer , 7 , fp);
if (res == NULL) {
perror("fgets:");
exit(-1);
}
fputs(buffer , stdout);
fclose(fp);
fp = NULL;
return 0;
}
5.fprintf
函数原型:
int fprintf( FILE *stream, const char *format [, argument ]...);
FILE *stream
输出流const char *format [, argument ]...
格式化数据和printf
用法类似
例:
#include <stdio.h>
#include <stdlib.h>
typedef struct Data {
int order;
double score;
}Data;
int main() {
Data data = { 1 , 100 };
FILE* fp = fopen("D:/test.txt", "w");
if (!fp) {
perror("fopen:");
exit(-1);
}
fprintf(fp , "%d %lf" , data.order , data.score);
fclose(fp);
fp = NULL;
return 0;
}
6.fscanf
函数原型:
int fscanf( FILE *stream, const char *format [, argument ]... );
FILE *stream
输入流const char *format [, argument ]...
格式化数据和scanf
用法类似int fscanf
读取成功返回读入的参数的个数,失败返回EOF
例:
#include <stdio.h>
#include <stdlib.h>
typedef struct Data {
int order;
double score;
}Data;
int main() {
Data temp = { 0 };
FILE* fp = fopen("D:/test.txt", "r");
if (!fp) {
perror("fopen:");
exit(-1);
}
fscanf(fp , "%d %lf" , &temp.order , &temp.score);
fprintf(stdout , "%d %lf", temp.order, temp.score);
fclose(fp);
fp = NULL;
return 0;
}
7.fwrite
函数原型:
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
const void *buffer
指向要写入数据的指针size_t size
每个元素的字节大小size_t count
写入元素的个数FILE *stream
文件流
例:
#include <stdio.h>
#include <stdlib.h>
typedef struct Data {
char name[20];
int order;
}Data;
int main() {
Data data = { "孙悟空" , 1 };
FILE* fp = fopen("D:/test.txt", "wb");
if (!fp) {
perror("fopen:");
exit(-1);
}
fwrite(&data , sizeof(data) , 1 , fp);
fclose(fp);
fp = NULL;
return 0;
}
8.fread
函数原型:
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
void *buffer
这是指向一个存放读取到的数据的指针。size_t size
每个元素的字节大小size_t count
读入元素的个数FILE *stream
文件流size_t fread
返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于count
。
例:
#include <stdio.h>
#include <stdlib.h>
typedef struct Data {
char name[20];
int order;
}Data;
int main() {
Data temp = { 0 };
FILE* fp = fopen("D:/test.txt", "rb");
if (!fp) {
perror("fopen:");
exit(-1);
}
fread(&temp, sizeof(temp), 1, fp);
printf("%s %d" , temp.name , temp.order);
fclose(fp);
fp = NULL;
return 0;
}