文章目录
目录
一、打开文件 --- fopen
函数原型
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
参数 :
pathmane : 打开文件的文件名(包含路径),一般只写文件名,文件名相当于首地址
mode : 打开文件的方式,如下:
r : 以只读方式打开文件,文件必须存在
r+ : 以读写方式打开文件,文件必须存在
w : 以只写方式打开文件,如果文件不存在,则会先创建再打开
w+ : 以读写方式打开文件,如果文件不存在,则会先创建再打开
a : 以只写方式打开文件,如果要新加内容,则会另起一行开始写入,如果文件不存在,则会先创建再打开
a+ : 以读写方式打开文件,如果要新加内容,则会另起一行开始写入,如果文件不存在,则会先创建再打开b : 以二进制流打开文件
返回值 :
成功返回对应的文件的流指针,失败返回NULL,并且设置错误号(errno)
errno : 当前系统中最后一个错误的编号
代码实现 :
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
FILE *fp = fopen("1.txt","r");//在当前目录下以只读的方式打开1.txt文件, fp :流指针
if(NULL == fp)
{
//printf("errno = %d : %s\ n", errno, strerror(errno));
perror("open 1.txt");
return -1;
}
printf("fopen successful! num = %d\n", fp->_fileno);//打印文件编号
return 0;
}
//如果 1.txt 存在,结果为 :
fopen successful! num = 3
//如果 1.txt 不存在,strerror 函数 :
errno = 2 : No such file or directory
//perror 函数 :
open 1.txt: No such file or directory
2. strerror 函数原型
#include <stdio.h>
char *strerror(int errnum);
参数 :
errnum : 错误号
返回值 :
成功返回错误原因
3. perror 函数原型
#include <stdio.h>
void perror(const char *s);
参数 :
s : 提示信息
一般用 perror 函数提示错误,因为 strerror 函数需要添加 <string.h> 头文件,比起 perror 函数较麻烦。
二、关闭文件 --- fclose
函数原型
#include <stdio.h>
int fclose(FILE *stream);
参数 :
stream : 关闭文件对应的流指针
返回值 :
成功返回0,失败返回-1/EOFEOF是宏,值为-1
代码实现 :
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
FILE *fp = fopen("1.txt","r");//在当前目录下以只读的方式打开1.txt文件, fp :流指针
if(NULL == fp)
{
//printf("errno = %d : %s\ n", errno, strerror(errno));
perror("open 1.txt");
return -1;
}
printf("fopen successful! num = %d\n", fp->_fileno);//打印文件编号
fclose(fp);
return 0;
}
三、按字节读写文件
1. fgetc()
函数原型
#include <stdio.h>
int fgetc(FILE *stream);
参数 :
stream : 流指针
返回值 :
成功返回读取的字符,失败返回-1;
读到文件末尾也会返回-1
代码实现 :
#include <stdio.h>
int main()
{
FILE *fp = fopen("1.txt", "r+");
if(NULL == fp)
{
perror("open 1.txt");
return -1;
}
char ch = fgetc(fp);//从文件中读取字符
printf("ch = %c\n", ch);
return 0;
}
2.fputc()
函数原型
#include <stdio.h>
int fputc(int c, FILE *stream);
参数 :
c : 输入的字符
stream : 流指针
返回值:
成功返回写入的字符,失败返回-1;
代码实现 :
#include <strings.h>
int main()
{
FILE *fp = fopen("1.txt", "w+");
if(NULL == fp)
{
perror("open");
return -1;
}
char ch = fgetc(stdin);//从键盘输入字符
int ret = fputc(ch, fp);//把键盘输入的字符写到文件中
if(ret < 0)
{
perror("fputc");
return -1;
}
return 0;
}
四、按行读写文件
1.fgets()
函数原型
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
参数 :
s : 字符串首地址
size : 请求读取数据的最大长度
stream : 流指针
返回值 :
成功返回得到字符串的首地址,失败返回NULL;
注 :
1. 当读取内容遇到换行符,读取结束
2. 最大读取内容为 size-1 个
代码实现 :
#include <stdio.h>
int main()
{
FILE *fp = fopen("1.txt", "r+");
if(NULL == fp)
{
perror("open");
return -1;
}
char buf[64] = {0};
//fgets(buf, 64, stdin);//读到的内容放入buf缓冲区;64:最大输入64个字节;从键盘上读取
fgets(buf, 64, fp);//从文件fp中读取
printf("%s\n", buf);//输出读取到的字符
return 0;
}
结果:
1.txt内容如下:
hello
world
运行结果:
hello
//fgets函数遇到换行符读取结束
2.fputs()
函数原型
#include <stdio.h>
char *fputs(const char *s, FILE *stream);
参数 :
s : 字符串首地址
stream : 流指针
返回值 :
失败返回-1;
注 :
1.当读取内容遇到换行符,读取结束
2.最大读取内容为 size-1 个
代码实现 :
#include <stdio.h>
int main()
{
FILE *fp = fopen("1.txt", "w+");//w+:原文件中的内容会被新写入的内容完全覆盖,相当于自动清空
if(NULL == fp)
{
perror("open");
return -1;
}
char buf[64] = {0};
fgets(buf, 64, stdin);
int ret = fputs(buf, fp);//向fp文件中写入数据
if(ret < 0)
{
perror("fputs");
return -1;
}
return 0;
}
结果:
1.txt:
hello
world
运行结果:
终端显示:
world
1.txt:
world
五、按对象读写文件
1. fread()
函数原型 :
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数 :
ptr : 存放字符串的首地址
size : 对象大小
nmemb : 对象个数
stream : 流指针
返回值 :
成功返回读到的对象个数,失败返回0;
2. fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数 :
ptr : 存放字符串的首地址
size : 对象大小
nmemb : 对象个数
stream : 流指针
返回值 :
成功返回读到的对象个数,失败返回0
六、刷新流 --- fflush
函数原型
#include <stdio.h>
int fflush(FILE *stream);
参数 :
stream : 流指针
返回值 :
成功返回0,失败返回-1
代码实现
#include <stdio.h>
int main()
{
//如果没有fflush,则必须把文件字节大小占满才会显示内容
printf("hello");
fflush(stdout);//强制刷新,在循环时提前看到输出的内容
while(1);
return 0;
}
七、文件定位
函数原型
#include <stdio.h>
long ftell(FILE *stream);
功能 :
返回文件指针相对于文件开头的偏移量
参数 :
stream : 流指针
返回值 :
成功返回文件指针相对于文件开头的偏移量,失败返回-1
int fseek(FILE *stream, long offset, int whence);
参数:
stream : 流指针
offset : 偏移量,可正可负,正:往后偏;负:往前偏
whence : 基准点
SEEK_SET : 将文件指针定位在文件开头
SEEK_CUR : 将文件指针定位在当前位置
SEEK_END : 将文件指针定位在文件末尾最终定位位置 = offset + whence
返回值 :
成功返回0,失败返回-1
代码实现:文件中字符的偏移
#include <stdio.h>
int main()
{
FILE *fp = fopen("1.txt", "r+");
if(NULL == fp)
{
perror("open");
return -1;
}
fseek(fp, 6, SEEK_SET);//偏移量为6
char ch = fgetc(fp);//从fp中读取字符,存储到ch中
printf("ch = %c\n", ch);打印偏移到的字符
return 0;
}
1.txt中的内容:
hello world
运行结果:
w
void rewind(FILE *stream);
功能 :
将文件指针定位在文件开头
八、判断错误流
函数原型
#include <stdio.h>
int feof(FILE *stream);
返回值 :
1--流访问结束
0--错误返回
总结
以上就是标准IO部分相关的函数介绍以及部分函数功能实现的例子,欢迎参考指正!