文件IO-标准IO、文件IO

文件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
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值