文件读写
#include <stdio.h>
读取文件
FILE *fopen(char *filename, char *mode);
参数说明:
打开方式 | 说明 |
---|---|
"r" | 以只读方式打开文件. 文件必须存在, 否则打开失败. |
"w" | 以写入方式打开文件. 如果文件不存在, 那么创建一个新文件; 如果文件存在, 那么清空文件内容. |
"a" | 以追加方式打开文件. 如果文件不存在, 那么创建一个新文件; 如果文件存在, 那么将写入的数据追加到文件的末尾. |
"r+" | 以读写方式打开文件. 文件必须存在, 否则打开失败. |
"w+" | 以写入/更新方式打开文件, 相当于w 和r+ 叠加的效果.如果文件不存在, 那么创建一个新文件; 如果文件存在, 那么清空文件内容. |
"a+" | 以追加/更新方式打开文件, 相当于a 和r+ 叠加的效果.如果文件不存在, 那么创建一个新文件; 如果文件存在, 那么将写入的数据追加到文件的末尾. |
"t" | 文本文件. 如果不写, 默认为"t" . |
"b" | 二进制文件. |
int fgetc( FILE * fp );
从 fp 所指向的输入文件中读取一个字符.
返回值是读取的字符, 如果发生错误则返回 EOF.char *fgets( char *buf, int n, FILE *fp );
从 fp 所指向的输入流中读取 n - 1 个字符. 它会把读取的字符串复制到缓冲区, 并在最后追加一个 null 字符来终止字符串.
如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF, 则只会返回读取到的字符, 包括换行符.int fscanf(FILE *fp, const char *format, ...);
从流 stream 读取格式化输入. 如果成功, 该函数返回成功匹配和赋值的个数; 如果到达文件末尾或发生读错误, 则返回 EOF.
format: [=%[*][width][modifiers]type=]
例:fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
类型 | 合格的输入 | 参数的类型 |
---|---|---|
c | 单个字符: 读取下一个字符. 如果指定了一个不为 1 的宽度 width, 函数会读取 width 个字符, 并通过参数传递, 把它们存储在数组中连续位置. 在末尾不会追加空字符 | char * |
d | 十进制整数: 数字前面的 + 或 - 号是可选的 | int * |
e, E, f, g, G | 浮点数: 包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E, 以及一个十进制数字. 两个有效的实例 -732.103 和 7.12e4 | float * |
o | 八进制整数 | int * |
s | 字符串. 这将读取连续字符, 直到遇到一个空格字符 (空格字符可以是空白、换行和制表符) | char * |
u | 无符号的十进制整数 | unsigned int * |
x, X | 十六进制整数 | int * |
写入文件
int fputc(int c, FILE *fp);
把参数 c 的字符值写入到 fp 所指向的输出流中.
如果写入成功, 返回写入的字符; 如果发生错误, 则会返回 EOF.int fputs(const char *s, FILE *fp);
把字符串 s 写入到 fp 所指向的输出流中.
如果写入成功, 它会返回一个非负值; 如果发生错误, 则会返回 EOF.int fprintf(FILE *fp, const char *format, ...);
发送格式化输出到流 stream 中. 如果成功, 则返回写入的字符总数, 否则返回一个负数.
format: %[flags][width][.precision][length]specifier
例:fprintf(fp, "%s %s %s %d", "We", "are", "in", 2023);
specifier (说明符) | 输出 |
---|---|
c | 字符 |
d 或 i | 有符号十进制整数 |
e | 使用 e 字符的科学科学记数法 (尾数和指数) |
E | 使用 E 字符的科学科学记数法 (尾数和指数) |
f | 十进制浮点数 |
g | 自动选择 %e 或 %f 中合适的表示法 |
G | 自动选择 %E 或 %f 中合适的表示法 |
o | 有符号八进制 |
s | 字符的字符串 |
u | 无符号十进制整数 |
x | 无符号十六进制整数 |
X | 无符号十六进制整数 (大写字母) |
p | 指针地址 |
n | 无输出 |
% | 字符 |
length (长度) | 描述 |
---|---|
h | 参数被解释为短整型或无符号短整型 (仅适用于整数说明符: i、d、o、u、x 和 X) |
l | 参数被解释为长整型或无符号长整型, 适用于整数说明符 (i、d、o、u、x 和 X) 及说明符 c (表示一个宽字符) 和 s (表示宽字符字符串) |
L | 参数被解释为长双精度型 (仅适用于浮点数说明符: e、E、f、g 和 G) |
.precision (精度) | 描述 |
---|---|
.number | 对于整数说明符 (d、i、o、u、x、X): precision 指定了要写入的数字的最小位数. 如果写入的值短于该数, 结果会用前导零来填充. 如果写入的值长于该数, 结果不会被截断. 精度为 0 意味着不写入任何字符. 对于 e、E 和 f 说明符: 要在小数点后输出的小数位数. 对于 g 和 G 说明符: 要输出的最大有效位数. 对于 s: 要输出的最大字符数. 默认情况下, 所有字符都会被输出, 直到遇到末尾的空字符. 对于 c 类型: 没有任何影响. 当未指定任何精度时, 默认为 1. 如果指定时不带有一个显式值, 则假定为 0. |
.* | 精度在 format 字符串中未指定, 但是会作为附加整数值参数放置于要被格式化的参数之前. |
width (宽度) | 描述 |
---|---|
(number) | 要输出的字符的最小数目. 如果输出的值短于该数, 结果会用空格填充. 如果输出的值长于该数, 结果不会被截断. |
* | 宽度在 format 字符串中未指定, 但是会作为附加整数值参数放置于要被格式化的参数之前. |
flags (标识) | 描述 |
---|---|
- | 在给定的字段宽度内左对齐, 默认是右对齐 (参见 width 子说明符). |
+ | 强制在结果之前显示加号或减号 (+ 或 -), 即正数前面会显示 + 号. 默认情况下, 只有负数前面会显示一个 - 号. |
(space) | 如果没有写入任何符号, 则在该值前面插入一个空格. |
# | 与 o、x 或 X 说明符一起使用时, 非零值前面会分别显示 0、0x 或 0X. 与 e、E 和 f 一起使用时, 会强制输出包含一个小数点, 即使后边没有数字时也会显示小数点. 默认情况下, 如果后边没有数字时候, 不会显示显示小数点. 与 g 或 G 一起使用时, 结果与使用 e 或 E 时相同, 但是尾部的零不会被移除. |
0 | 在指定填充 padding 的数字左边放置零 (0), 而不是空格 (参见 width 子说明符). |
其他操作
int fclose( FILE *fp );
如果成功关闭文件, fclose( ) 函数返回零; 如果关闭文件时发生错误, 函数返回 EOF.
这个函数会清空缓冲区中的数据, 关闭文件, 并释放用于该文件的所有内存.int fflush(FILE *stream);
fflush(stdout)
: 将缓冲区中的内容写到stream所指的文件中去. 若stream为NULL, 则会将所有打开的文件进行数据更新.
fflush(stdin)
: 刷新缓冲区, 将缓冲区内的数据清空并丢弃.int setvbuf(FILE *stream, char *buffer, int mode, size_t size);
定义流 stream 应如何缓冲. 如果成功, 则该函数返回 0, 否则返回非零值.-
stream -- 指向 FILE 对象的指针, 该 FILE 对象标识了一个打开的流.
-
buffer -- 分配给用户的缓冲. 如果设置为 NULL, 该函数会自动分配一个指定大小的缓冲.
-
mode -- 指定了文件缓冲的模式:
- _IOFBF -- 全缓冲, 对于输出, 数据在缓冲填满时被一次性写入; 对于输入, 缓冲会在请求输入且缓冲为空时被填充.
- _IONBF -- 无缓冲, 每个 I/O 操作都被即时写入. buffer 和 size 参数被忽略.
- _IOLBF -- 行缓冲, 对于输出, 数据在遇到换行符或者在缓冲填满时被写入, 具体视情况而定; 对于输入, 缓冲会在请求输入且缓冲为空时被填充, 直到遇到下一个换行符.
-
size -- 缓冲的大小, 以字节为单位.
-
#include <stdio.h>
int main()
{
FILE* f = NULL;
char str[50];
if((f = fopen("E:\\test.txt", "rt")) != NULL)
{
while(fgets(str, 50, f) != NULL)
{
printf("%s", str);
}
fclose(f); // 只有当成功打开文件才需要清空缓冲区
}
else
{
printf("Fail to open file!");
}
return 0;
}
标签:fp,文件,字符,int,读写,写入,FILE
From: https://www.cnblogs.com/khrushchefox/p/17320736.html