时间: 2020-07-19 18:16
文章目录
1,mode打开方式
-
“r” 以 “读” 的方式打开一个文本文件 (只读)
-
“r+” 与 “r” 的区别在于, 增加了 “写” (可读可写)
-
“rb” 以 “读” 的方式打开一个二进制文件 (只读)
-
“rb+” 与 “rb” 的区别在于, 增加了 “写” (可读可写)
-
“w” 以 “写” 的方式打开一个文本文件, 同时原文件的内容将被新写入的数据覆盖, 如果这个文件不存在将会创建一个文件
-
“w+” 与 “w” 的区别在于, 增加了 “读”
-
“wb” 以 “写” 的方式打开一个二进制文件
-
“wb+” 与 “wb” 的区别在于, 增加了 “读”
-
“a” 以 “尾部追加” 的方式打开一个文本文件 (只写)
-
“a+” 以 “a” 的区别在于, 增加了 “读” (可读可写)
-
“ab” 以 “尾部追加” 的方式打开一个二进制文件 (只写)
-
“ab+” 与 “ab” 的区别在于, 增加了 “读” (可读可写)
2,文件的打开与关闭
-
fopen 打开
FILE *fopen( const char *filename, const char *mode );
filename: 指向所要打开的文件的指针
mode : 文件的打开方式
返回一个该文件的指针.如果发生错误, fopen()返回NULL
-
fclose 关闭
int fclose( FILE *stream );
stream: 指向所要关闭的文件的指针
执行成功时返回0,否则返回EOF.
eg.
#include <stdio.h>
int main() {
FILE* file = NULL; //文件指针
char str[64];
file = fopen("test.txt", "r"); //以 "r" 只读方式打开一个文件, 并返回该文件的指针
if (file) { //如果文件指针非空, 则打开成功
fgets(str, sizeof(str), file);
puts(str);
fclose(file); //关闭文件
}
else { //如果文件指针为空指针, 则打开失败
printf("文件打开失败\n");
}
return 0;
}
3,fgetc 与 fputc
- fgetc 从指定文件读取一个字符
int fgetc( FILE *stream );
stream: 文件指针
返回值是字符, 如果到达文件尾或者发生错误时返回EOF.
- fputc 向指定文件输入一个字符
int fputc( int c, FILE *stream );
c: 要输入的字符
stream: 文件指针
返回值是字符, 发生错误时返回值是EOF.
eg.
#include <stdio.h>
int main() {
FILE* file = NULL; //文件指针
char c;
file = fopen("源.cpp", "r"); //以 "r" 只读方式打开一个文件, 并返回该文件的指针
if (file) { //如果文件指针非空, 则打开成功
while (1) {
c = fgetc(file); //从指定文件中读取一个字符, 并返回
if (c == EOF) { //如果文件全部读取完, 则跳出循环
break;
}
fputc(c, stdout); //将字符 c 输入到标准输出设备, 屏幕(stdout)
}
fclose(file); //关闭文件
}
else { //如果文件指针为空指针, 则打开失败
printf("文件打开失败\n");
}
return 0;
}
4,fgets 与 fputs
-
fgets 从指定文件读取一个指定大小的字符串 (一行)
char *fgets( char *str, int numChars, FILE *stream );
str: 数据的存储位置
numChars: 要读取的最大字符数 (最多读取 numChars - 1 个字符, 最后一个位置存放字符串结束符)
stream: 指向文件结构的指针
如果fgets()达到[numChars - 1]个字符或者遇到EOF, str(字符串)将会以null结束.fgets()成功时返回str(字符串),失败时返回NULL.
-
fputs 向指定文件输入一个字符串
int fputs( const char *str, FILE *stream );
str: 输入的字符串
stream: 指向文件结构的指针
成功时返回非负值, 失败时返回EOF.
eg.
#include <stdio.h>
int main() {
FILE* file = NULL; //文件指针
char str[128];
char* p = NULL;
file = fopen("源.cpp", "r"); //以 "r" 只读方式打开一个文件, 并返回该文件的指针
if (file) { //如果文件指针非空, 则打开成功
while (1) {
p = fgets(str, sizeof(str), file); //从指定文件中读取一行字符, 若读取失败则返回 NULL
if (!p) { //如果读取到文件的末尾, 则跳出循环
break;
}
fputs(str, stdout); //将字符串 str 输出到标准输出设备, 屏幕(stdout)
}
fclose(file); //关闭文件
}
else { //如果文件指针为空指针, 则打开失败
printf("文件打开失败\n");
}
return 0;
}
5,fprintf 与 fscanf
-
fprintf 设置格式并将一系列字符和值输出到输出流 中
int fprintf( FILE *stream, const char *format [, argument ]... );
stream: 指向文件结构的指针。
format: 窗体控件字符串。
返回写入的字节数, 输出错误时返回一个负值
-
fscanf 函数从流 的当前位置将数据读取到由参数(如果有)指定的位置
int fscanf( FILE *stream, const char *format [, argument ]... );
stream: 指向文件结构的指针。
format: 窗体控件字符串。
返回成功转换并分配的字段数;返回值不包括已读取但未分配的字段。 返回值为 0 表示没有分配任何字段, 如果发生错误,或者在第一次转换之前到达文件流的末尾,则返回值为 EOF
eg.
#include <stdio.h>
int main() {
FILE* file = NULL;
char str[64];
file = fopen("test.txt", "w");
if (file) {
fprintf(file, "%s", "world"); //将格式化字符输出到 file 中
fclose(file);
}
else {
printf("文件打开失败");
}
file = fopen("test.txt", "r");
if (file) {
fscanf(file, "%s", str); //从 file 中读取匹配的字符串到 str
puts(str);
fclose(file);
}
else {
printf("文件打开失败");
}
return 0;
}
6,fwrite 与 fread
-
fwrite 将数据写入流。
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
buffer: 指向要写入的数据的指针。
size: 项大小(以字节为单位)。
count: 要写入的项的最大数量。stream: 指向文件结构的指针。
fwrite返回实际写入的完整项的数量,如果发生错误,则可能小于计数
-
fread 从流读取数据。
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
buffer: 数据的存储位置。
size: 项大小(以字节为单位)。count: 要读取的项的最大数量。
stream: 指向文件结构的指针。
fread返回实际读取的完整项的数量,如果发生错误,或者在到达计数之前遇到文件末尾,则此值可能小于计数。
eg. fwrite
#include <stdio.h>
int main() {
FILE* file = NULL;
int str = 888;
file = fopen("binary.txt", "wb"); //以二进制写的方式打开一个文件
if (file) {
fwrite(&str, sizeof(int), 1, file); //将数据写入流
fclose(file);
}
else {
printf("文件打开失败\n");
}
return 0;
}
eg.fread
#include <stdio.h>
int main() {
FILE* file = NULL;
char arr[32];
int str;
file = fopen("binary.txt", "rb"); //以二进制读的方式打开一个文件
if (file) {
fread(arr, sizeof(char), sizeof(arr), file); //从流读取数据。
fread(&str, sizeof(int), 1, file);
fclose(file);
}
else {
printf("文件打开失败\n");
}
printf("%s\t%d\n", arr, str);
return 0;
}
7,_putw 与 _getw
-
_putw 将一个整数写入到流中。
int _putw( int binint, FILE *stream );
binint
要输出的二进制整数。stream
指向文件结构的指针。返回写入的值。 返回值EOF可能指示错误
-
_getw 从流中获取整数。
int _getw( FILE *stream );
stream
指向文件结构的指针。_getw返回读取的整数值。 EOF的返回值指示错误或文件尾
eg.
#include <stdio.h>
int main() {
FILE* file = NULL;
int ret = 0;
file = fopen("num.txt", "wb"); //以二进制写的方式打开一个文件
if (file) {
for (int i = 0; i < 10; ++i) {
_putw(i, file); //将 i 以二进制的形式写入 file 中
}
fclose(file);
}
else {
printf("文件打开失败\n");
}
file = fopen("num.txt", "rb"); //以二进制读的方式打开一个文件
if (file) {
while (1) {
ret = _getw(file); //从文件中读取 int 类型的二进制值, 并返回
if (feof(file)) { //如果文件读取完则跳出循环
break;
}
printf("%d", ret);
}
fclose(file);
}
else {
printf("文件打开失败\n");
}
return 0;
}
8,feof
feof 判断是否到达文件的末尾
int feof(
FILE *stream
);
stream
指向文件结构的指针。
如果读取操作已尝试读取超过文件末尾的值, feof函数将返回非零值;否则返回0。
eg.
#include <stdio.h>
int main() {
FILE* file = NULL;
char c;
file = fopen("源.cpp", "r");
if (file) {
while (1) {
c = fgetc(file);
if (feof(file)) { //判断是否到达文件的末尾
break;
}
fputc(c, stdout);
}
fclose(file);
}
else {
printf("文件打开失败\n");
}
return 0;
}
9,ferror 与 perror
- ferror 检测文件是否发生错误
int ferror(
FILE *stream
);
stream
指向文件结构的指针。
如果流中未发生错误,则ferror将返回0。 否则,返回一个非零值。
-
perror 打印错误消息。
void perror( const char *message );
message
要打印的字符串消息。(随便写)(将会自动拼接到错误信息的前端)
eg.
#include <stdio.h>
int main() {
FILE* file = NULL;
file = fopen("源.cpp", "r"); //以只读方式打开一个文件
if (file) {
fputc('A', file); //向文件中写入一个字符
if (ferror(file)) { //检测是否发生错误
perror("错误信息: "); //打印错误信息
}
fclose(file);
}
else {
printf("文件打开失败\n");
}
return 0;
}
10,clearerr_s
clearerr_s 重置流的错误指示符
errno_t clearerr_s(
FILE *stream
);
stream
指向文件结构的指针
如果成功,则返回零;如果stream为NULL,则返回EINVAL 。
eg.
#include <stdio.h>
int main() {
FILE* file = NULL;
file = fopen("源.cpp", "r"); //以只读方式打开文件
if (file) {
fputc('A', file); //向文件中写入一个字符
if (ferror(file)) { //检测是否有错误
perror("错误信息: "); //打印错误信息
clearerr_s(file); //清除错误标志
}
fclose(file);
}
else {
printf("文件打开失败\n");
}
return 0;
}
11,ftell
ftell 获取文件指针的当前位置。
long ftell(
FILE *stream
);
stream
指向文件结构的指针
ftell返回当前文件位置。
eg.
#include <stdio.h>
int main() {
FILE* file = NULL;
long index = -1;
file = fopen("源.cpp", "r"); //以只读方式打开文件
if (file) {
index = ftell(file); //获取当前文件指针的位置
printf("%d\n", index); //打印当前位置
fgetc(file); //读取文件中的一个字符
index = ftell(file); //获取当前文件指针的位置
printf("%ld\n", index); //打印当前位置
fclose(file);
}
else {
printf("文件打开失败\n");
}
return 0;
}
12,fseek
fseek 将文件指针移到指定位置。
int fseek(
FILE *stream,
long offset,
int origin
);
stream
指向文件结构的指针。
offset
偏移量
origin
初始位置。(SEEK_SET 从文件开始的位置定位, 此时参数2, 必须大于0
SEEK_CUR 从文件当前位置开始定位
SEEK_END 从文件结束位置开始定位, 此时参数2, 必须小于0)
eg.
#include <stdio.h>
int main() {
FILE* file = NULL;
char arr[64];
char arr2[64];
char c;
file = fopen("源.cpp", "r"); //以只读方式打开文件
if (file) {
fseek(file, -32, SEEK_END); //定位到文件的最后倒数第32个字符处
while ((c = fgetc(file)) != EOF) { //从倒数第32个字符处开始读取至文件末尾
putc(c, stdout);
}
fseek(file, 0, SEEK_SET); //定位到文件的开始位置
fgets(arr, sizeof(arr), file); //读取一行
puts(arr); //将字符串写入 stdout
fseek(file, 10, SEEK_CUR); //定位到当前位置往后10个字符处
fgets(arr2, sizeof(arr2), file); //读取一行
puts(arr2); //将字符串写入 stdout
fclose(file);
}
else {
printf("文件打开失败\n");
}
return 0;
}