文章目录
文件IO
1. 标准IO介绍及缓冲区
1.1 标准IO介绍
缓冲提升效率。
行缓冲的概念:只要有换行,程序就输出。
Printf("Hello world");
printf("Hello world\n");
全缓冲:缓冲区满再输出。
fopen.c
#include<stdio.h>
int main(int argc, char *argv[]) {
FILE *fp;
fp = fopen("1.txt","a");
if(fp == NULL) {
printf("open failed\n");
}else
printf("open success\n");
return 0;
}
buffer.c
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[]) {
int i = 0;
for(i = 0; i <2000; i++)
{
printf("a");
}
// printf("hello world\n");
while(1){
sleep(1);
}
}
2. 标准IO:文件的打开、关闭
ffclose()函数的入参stream不能为空,否则会出现段错误。
fclose.c
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main(int argc, char *argv[]) {
FILE *fp;
int fpret;
fp = fopen("1.txt", "r");
if(fp == NULL) {
perror("fopen");
printf("fopen:%s\n",strerror(errno));
}else {
printf("OPen file success\n");
}
}
3. 标准IO的读写(字符、行)
3.1 读写单个字符
注意:函数返回值是int类型不是char类型,主要是为了拓展返回值的范围。
getchar(void)只能读取标准输入(键盘)的内容。
打开文件后,是从开头开始读,读完一个后指针会后移。关闭后再打开还是从头开始读。
3.2 按行输入(读取整个行)
3.3 按行输出文件(写整个行)
4. 标准IO读写:二进制方式
4.1 二进制读写概念
除了文本文件都是二进制文件(图片、声音文件都是二进制文件),无法通过字符来表示。
ASCII只能表示英文和数字,中文有其他编码方式UTF-8或GBK编码。
4.2 二进制文件读写代码实现
不能写完之后直接读,写完之后指针在末尾,不能直接读。
重新打开文件之后,指针会重新指向文件头部。
fread.c
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
struct student{
char name[16];
int age;
char sex[5];
};
int main(int argc, char *argv[]) {
FILE *fp;
char *buff;
size_t ret,ret1;
struct student stu;
struct student stu1;
struct student stu2;
fp=fopen("1.bin", "w");
if(fp==NULL) {
perror("fopen");
return 0;
}
strcpy(stu.name, "lisi");
stu.age = 20;
strcpy(stu.sex,"male");
strcpy(stu1.name, "zhangsan");
stu1.age = 19;
strcpy(stu1.sex,"male");
ret = fwrite(&stu, sizeof(stu),1,fp);
ret1 = fwrite(&stu1, sizeof(stu1),1,fp);
if((ret || ret1) == -1){
perror("fwrite");
goto end;
}else{
printf("write struct student success!\n");
}
fclose(fp);
fp = fopen("1.bin", "r");
if(fp == NULL) {
perror("fopen");
return 0;
}
if(ret == -1) {
goto end;
}
// printf("name=%s, age=%d, sex=%s\n", stu.name, stu.age, stu.sex);
printf("name=%s, age=%d, sex=%s\n", stu2.name, stu2.age, stu2.sex);
/*
buff=(char*)malloc(100);
if(buff==NULL){
return 0;
}
ret = fread(buff,10,1,fp);
if(ret == -1){
perror("fread");
goto end;
}
printf("buf=%s\n", buff);
*/
end:
// free(buff);
fclose(fp);
}
5. 流刷新定位
5.1 文件流的刷新
5.2 文件流的定位
6. 格式化输入输出
7.标准IO练习
8. 文件IO(概念、打开、读写)
8.1 文件IO的概念
文件IO只是二进制读写。
文件描述符不是指针,是一个非负整数。
8.2 文件IO的打开使用
8.3 文件IO的关闭
8.4 文件IO的读写定位
注意:sizeof和strlen。strlen对字符串计数,遇见\0结束。
注意:读字符串时最后一个位置赋0,字符串结束符。“\0”的ASCII值为0,就不会出现乱码。
#include<stdio.h>
#include<time.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc, char *argv[]) {
// FILE *fp;
time_t ctime;
struct tm *ctimestr;
int linecount=0;
int fd,ret;
char buf[32];
fd = open("1.txt",O_RDWR|O_CREAT|O_APPEND,0666);
if(fd<0) {
perror("open");
return 0;
}
while(1){
ctime = time(NULL);
ctimestr = localtime(&ctime);
printf("%04d-%02d-%02d %02d:%02d:%02d\n",ctimestr->tm_year+1900, ctimestr->tm_mon+1,ctimestr->tm_mday,
ctimestr->tm_hour,ctimestr->tm_min,ctimestr->tm_sec);
sprintf(buf, "%d %04d-%02d-%02d %02d:%02d:%02d\n",linecount, ctimestr->tm_year+1900, ctimestr->tm_mon+1,ctimestr->tm_mday,
ctimestr->tm_hour,ctimestr->tm_min,ctimestr->tm_sec);
ret = write(fd,buf,strlen(buf));
if(ret<0){
perror("write");
goto END;
}
// fflush(fd);
linecount++;
sleep(1);
}
END:
close(fd);
}
9. 目录操作及文件属性获取
9.1 目录的读取
9.2 文件属性的获取
注意:在linux和windows共享目录下执行chmod不能达到效果
10. 静态库和动态库的使用
10.1 静态库的使用
静态库浪费磁盘空间。
10.2动态库的使用
注意:动态库不会默认在当前目录下。
找不到可执行文件所使用的动态库。
查看所使用的动态库:ldd test