【C语言】文件操作(上部) [ 编程杂谈 ]
大数据男孩 文章 正文
明妃
{{nature("2022-08-14 17:23:19")}}更新打开文件 & 关闭文件
打开文件
需要文件指针
接收;关闭文件
需要传入文件指针
FILE *fp; // 定义文件指针
打开文件
使用到的函数
fopen()
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
参数
参数 | 含义 |
---|---|
*path | 文件的路径,支持相对路径 、绝对路径 |
*mode | 指定文件打开的模式:r 、w 、a 、r+ 、w+ 、a+ b :以二进制形式打开文件,可以与上面的6种结合("rb", "wb", "ab", "r+b", "w+b", "a+b" ) |
返回值
- 打开成功,则返回一个
指向 FILE结构的 文件指针
; - 打开失败,则返回
NULL
并设置errno
为指定的错误。
打开文件模式
文件打开模式 | 说明 |
---|---|
"r" | 1. 以只读 的模式打开一个文本文件,从文件头 开始读取 2. 该文本文件 必须存在 |
"w" | 1. 以只写 的模式打开一个文本文件,从文件头 开始写入 2. 如果 文件不存在则创建 一个新的文件3. 如果文件已存在则将文件的长度截断为 0(重新写入的内容将 覆盖 原有的 所有内容 ) |
"a" | 1. 以追加 的模式打开一个文本文件,从文件末尾 追加内容 2. 如果 文件不存在则创建 一个新的文件 |
"r+" | 1. 以读和写的模式 打开一个文本文件,从文件头 开始读取和写入 2. 该文件 必须存在 3. 该模式不会将文件的长度截断为 0(只 覆盖重新写入的内容 ,原有的内容保留 ) |
"w+" | 1. 以读和写的模式 打开一个文本文件,从文件头 开始读取和写入 2. 如果文件 不存在则创建 一个新的文件3. 如果文件已存在则将文件的长度截断为 0( 重新写入的内容 将覆盖原有的所有内容 ) |
"a+" | 1. 以读和追加的模式 打开一个文本文件2. 如果文件 不存在则创建 一个新的文件3. 读取是 从文件头 开始 ,而写入 则是在 文件末尾 追加 |
"b" | 1. 与上面 6 中模式均可结合("rb", "wb", "ab", "r+b", "w+b", "a+b") 2. 其描述的含义一样,只不过操作的对象是二进制文件 |
关闭文件
使用到的函数
fclose()
#include <stdio.h>
int fclose(FILE *fp);
参数
参数 | 含义 |
---|---|
fp |
指向一个待关闭的文件指针 |
返回值:
- 关闭成功,返回值是 0;
- 关闭失败,返回值是
EOF
,并设置errno
为指定的错误。
备注:
磁盘已满
、设备出错
或者 I/O 错误
均可能导致 fclose 函数调用失败。
实例 (打开文件 & 关闭文件)
#include <stdio.h>
#include <stdlib.h>
int main(void){
FILE *fp; // 定义文件指针
// 打开文件
fp = fopen("data.txt","r");
if (fp == NULL){
printf("打开文件失败!!!\n");
exit(EXIT_FAILURE);
};
// 关闭文件
if (fclose(fp) != EOF){
printf("关闭文件成功~~~");
exit(EXIT_SUCCESS);
};
return 0;
}
[]()
文件读写
字符读写
字符读 'fgetc()'、'getc()'
fgetc()
说明
#include <stdio.h>
...
int fgetc(FILE *stream);
参数说明:
- stream 该参数是一个 FILE 对象的指针,指定一个待读取的文件流
返回值:
- 成功:
- 将读取到的
unsigned char 类型
转换为int 类型
并返回
;
- 将读取到的
- 失败:
- 如果文件结束或者遇到错误则返回
EOF
。
- 如果文件结束或者遇到错误则返回
getc()
说明
fgetc()
、getc()
两个的功能 和 描述基本上是 一模一样 的
,它们的区别主要在于实现上:fgetc() 是一个函数
;而 getc() 则是一个宏的实现
实例
#include <stdio.h>
#include <stdlib.h>
int main(){
// 定义文件指针
FILE *fp;
// 打开文件
if ((fp = fopen("./data.txt","r")) == NULL){
// 文件打开失败
exit(EXIT_FAILURE);
}
// 读取文件的内容
char ch;
while ((ch = fgetc(fp)) != EOF){
putchar(ch);;
}
// 关闭文件流
fclose(fp);
return 0;
}
[]()
字符写 'fputc()'、'putc()'
将一个字符 写入
到指定的文件中
并推进文件的位置指示器(用来指示接下来要读写的下一个字符的位置)。
fputc()
说明
#include <stdio.h>
...
int fputc(int c, FILE *stream);
参数说明:
c
: 指定待写入 的字符
stream
: 该参数是一个FILE 对象的 指针
,指定一个待写入的文件流
返回值:
- 成功:
- 返回
写入的字符
;
- 返回
- 失败:
- 如果文件结束或者遇到错误则返回
EOF
。
- 如果文件结束或者遇到错误则返回
putc()
说明
fputc()
、putc()
两个的功能 和 描述基本上是 一模一样 的
,它们的区别主要在于实现上:fputc() 是一个函数
;而 putc() 则是一个宏的实现
实例
#include <stdio.h>
#include <stdlib.h>
int main(){
// 定义文件指针
FILE *fp;
// 打开文件
if ((fp = fopen("./data.txt","w")) == NULL){
// 文件打开失败
exit(EXIT_FAILURE);
}
// 写入一个字符
char ch = 'A';
if (fputc(ch,fp) == EOF){
// 写入失败
exit(EXIT_FAILURE);
};
// 关闭文件流
fclose(fp);
return 0;
}
[]()
字符串读写
字符读 'fgets()'
用于从指定文件
中读取 字符串
。
最多可以读取
size - 1
个字符,因为结尾处会自动添加
一个字符串结束符 '\0'
。当 读取 到换行符('\n')
或文件结束符(EOF)
时,表示结束读取('\n'
会被作为一个合法的 字符
读取)。
fgets()
说明
#include <stdio.h>
...
char *fgets(char *s, int size, FILE *stream);
参数说明:
- s: 字符型指针,指向用于
存放读取 字符串的 位置
- size: 指定
读取的 字符数
(包括最后自动添加的 '\0') - stream: 该参数是一个
FILE 对象的 指针
,指定一个待操作的数据流
返回值:
- 成功:
- 返回
s
参数指向的地址
- 返回
- 失败:
- 如果在
读取 字符的 过程
中遇到EOF
,则 eof 指示器被设置;如果还没读入 任何字符
就遇到
这种EOF
,则s
参数指向的位置保持原来的内容
,函数返回 NULL
。 - 如果在读取的过程中
发生错误
,则 error 指示器被设置,函数返回 NULL
,但s
参数指向的内容 可能 被改变
。
- 如果在
实例
#include <stdio.h>
#include <stdlib.h>
#define MAX 1024
int main(){
// 打开文件
FILE *fp;
if ((fp = fopen("./data.txt","r")) == NULL){
exit(1);
}
// 读取文件
char s[MAX];
if (fgets(s,MAX,fp) == NULL){
// 读取失败
exit(2);
};
printf("%s",s); // 输出读取内容
// 关闭文件
fclose(fp);
return 0;
}
[]()
字符写 'fputs()'
fputs 函数用于将一个字符串写入到指定的文件中,表示字符串结尾的 '\0' 不会被一并写入
fputs()
说明
#include <stdio.h>
...
int fputs(const char *s, FILE *stream);
参数说明:
- s: 字符型指针,指向用于
存放 待写入 字符串的位置
- stream: 是一个
FILE 对象的 指针
,指定
一个待操作的数据流
返回值:
- 成功:
- 返回一个
非 0 值
- 返回一个
- 失败:
- 返回
EOF
- 返回
实例
#include <stdio.h>
#include <stdlib.h>
int main(void){
// 打开文件
FILE *fp;
if ((fp = fopen("./data.txt","w")) == NULL){
exit(1); // 打开文件失败
};
// 写入内容
char s[] = "i love you ***";
if (fputs(s,fp) != 0){
exit(2); // 写入失败
}
// 关闭失败
fclose(fp);
return 0;
}
[]()
{{nature('2020-01-02 16:47:07')}} {{format('12641')}}人已阅读
{{nature('2019-12-11 20:43:10')}} {{format('9527')}}人已阅读
{{nature('2019-12-26 17:20:52')}} {{format('7573')}}人已阅读
{{nature('2019-12-26 16:03:55')}} {{format('5017')}}人已阅读
目录
标签云
一言
评论 0
{{userInfo.data?.nickname}}
{{userInfo.data?.email}}