基础IO
1. 回顾IO库函数接口 2. 学习系统调用IO接口 3. 探讨IO操作句柄 4. 重定向实现 5. 文件系统的了解 6. 动态库与静态库的生成与使用一、回顾IO库函数接口
1.fopen
回顾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 | 对文件数据进行二进制操作 |
2.fwrite
fwrite: ptr:要写入文件的数据的空间地址; size:块大小; nmemb:块个数; stream:操作句柄--fopen返回的文件流指针; 返回值:成功返回实际写入文件的块个数,失败返回0;3.fread
fread: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,通过返回值无法确定是否已经读取到了数据。
4.fseek
fseek:
stream:操作句柄-打开文件返回的文件流指针
offset:相对起点开始的偏移量(偏移量可以是负数–正数向后,负数向前)
whence:相对起点—SEEK_SET-起始位置; SEEK_CUR-当前位置; SEEK_END-末尾位置
返回值:成功返回0;失败返回-1;
5.fclose
fclose:int fclose(FILE *stream);--关闭文件,释放资源
二、代码实现及问题
代码如下(示例):
1.创建并打开文件
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main()
{
//fopen(文件路径名,打开方式);
FILE *fp = fopen("./test.txt","r");
if(fp == NULL){
perror("fopen error");
return -1;
}
return 0;
}
我们这里用的是" r ",并不会创建新文件,所以会报文件不存在的错误 只有 " r " 和 " r+ "不会创建新文件其他的都可以
2.写入数据
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
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;
}
3.读取数据
char buf[1024] = { 0 };
ret = fread(buf, 1023, 1, fp);
printf("buf:%s------%d\n", buf, ret);
解决方案:
要想读取出数据只需跳转读写位置,使用fseek函数跳转至文件开头即可
可以将一块大小改为5个字节
所以通常情况下建议块大小设置为1,块个数为你的数据长度
4.代码实现
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 }