回顾IO库函数接口:fopen,fwrite,fread,fclose,fseek–跳转当前读写位置
fopen:
FILE *fopen(const char *path, const char *mode);
mode:“r”, “r+”, “w”, “w+”, “a”, “a+”, “b”
path:要打开的文件路径名称; 返回值:失败返回NULL;成功返回一个文件流指针FILE*r | 只读 |
---|---|
r+ | 可读可写 |
w | 只写,文件不存在则创建新文件 |
w+ | 可读可写,文件不存在则创建新文件,文件已经存在则截断 |
a | 追加只写-总是将数据写入文件末尾,文件不存在则创建新文件 |
a+ | 读和追加写,打开文件后从起始读,但是写总是在末尾,文件不存在则创建新文件 |
b | 对文件数据进行二进制操作 |
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:一块缓冲区内存空间的地址,用于存放读取的数据;
size:块大小; nmemb:块个数;
stream:操作句柄--fopen返回的文件流指针;
返回值:成功返回读取到完整块个数; 出错返回0;读取到文件末尾返回0;读取的数据不足一块也返回0;
建议:块大小为1,块个数为操作数据长度,否则若读取一块数据50字节,但是实际只读取了40字节的时候也会返回0,通过返回值无法确定是否已经读取到了数据。
stream:操作句柄-打开文件返回的文件流指针
offset:相对起点开始的偏移量(偏移量可以是负数–正数向后,负数向前)
whence:相对起点—SEEK_SET-起始位置; SEEK_CUR-当前位置; SEEK_END-末尾位置
返回值:成功返回0;失败返回-1;
int fclose(FILE *stream);--关闭文件,释放资源
代码如下(示例):
#include
#include
#include
#include
int main()
{
//fopen(文件路径名,打开方式);
FILE *fp = fopen("./test.txt","r");
if(fp == NULL){
perror("fopen error");
return -1;
}
return 0;
}
我们这里用的是" r ",并不会创建新文件,所以会报文件不存在的错误 只有 " r " 和 " r+ "不会创建新文件其他的都可以
#include
#include
#include
#include
int main()
{
//fopen(文件路径名,打开方式);
FILE *fp = fopen("./test.txt","w+");
if(fp == NULL){
perror("fopen error");
return -1;
}
char *ptr = "今天的天气好晴朗!\n";
//fwrite(地址,大小,句柄)
int ret = fwrite(ptr, strlen(ptr), 1, fp);
if(ret == 0){
perror("perror fwrite error");
return -1;
}
printf("ret:%d\n", ret);
return 0;
}
char buf[1024] = {
0 };
ret = fread(buf, 1023, 1, fp);
printf("buf:%s------%d\n", buf, ret);
解决方案:
要想读取出数据只需跳转读写位置,使用fseek函数跳转至文件开头即可
可以将一块大小改为5个字节
所以通常情况下建议块大小设置为1,块个数为你的数据长度
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<string.h>
5 int main()
6 {
7 //fopen(文件路径名,打开方式);
8 FILE *fp = fopen("./test.txt","w+");
9 if(fp == NULL){
10 perror("fopen error");
11 return -1;
12 }
13 fseek(fp, 10, SEEK_END);
14 char *ptr = "今天的天气好晴朗!\n";
15 //fwrite(地址,大小,句柄)
16 int ret = fwrite(ptr, strlen(ptr), 1, fp);
17 if(ret == 0){
18 perror("perror fwrite error");
19 return -1;
20 }
21 printf("ret:%d\n", ret);
22 //fseek(句柄,偏移量,相对起点)
23 fseek(fp, 0, SEEK_SET);
24 char buf[1024] = {
0 };
25 ret = fread(buf, 1, 1023, fp);
26 if(ret == 0){
27 printf("没有读取到数据\n");
28 }
29 printf("buf:%s------%d\n", buf, ret);
30 fclose(fp);
31 return 0;
32 }