集训第一天所学

第一天我们主要学习了文件编程的相关知识
1.不带缓存的(系统调用)-文件访问:
主要学习了open,read,write,lseek函数的运用。
2.带缓存的(库函数)- 文件访问
主要学习了fopen,fread,fwrite,fseek.
3.不带缓存的I/O对是文件描述符操作,带缓存的I/O是针对流的。
标准I/O库就是带缓存的I/O,它由ANSI C标准说明。当然,标准I/O最终都会调用上面的I/O例程。
标准I/O库代替用户处理很多细节,比如缓存分配、以优化长度执行I/O等。
4.对于lseek成功返回返回移动后指针距离文件开头的长度,对于fseek成功返回0.
之后我们讲了测试了不带缓存与带缓存下文件的长度,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
int length;

/*int fd = open(argv[1], O_RDWR);
if (-1 == fd)
{
	perror("open");
	exit(1);
}

length = lseek(fd, 0, SEEK_END);  //文件指针移动到文件末尾,返回移动后指针距离文件开头的长度*/
FILE *fp = fopen(argv[1], "a+");
if (NULL == fp)
{
	perror("fopen");
	exit(1);
}
fseek(fp, 0, SEEK_END);   //成功返回0
length = ftell(fp);       //返回文件指针距离文件开头的长度  
printf("%d\n", length);

fclose(fp);

return 0;

}
5.然后我们还讲了不带缓存下实现一个文件到另外一个文件的拷贝,代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int fd;
char buf[32] = {0};
//int ret;
ssize_t ret;

/*fd = open("hello.c", O_RDWR);   //读写方式打开存在的文件
if (-1 == fd)
{
	perror("open");
	exit(1000);
}*/

//fd = open("hello.txt", O_RDWR | O_CREAT, 00700);  //先创建文件,再打开,文件可以存在
fd = open("hello.txt", O_RDWR | O_CREAT | O_EXCL, 00700);  //先创建文件,再打开, 文件必须不存在
if (-1 == fd)
{
	perror("open");
	exit(1);
}

scanf("%s", buf);
ret = write(fd, buf, strlen(buf));
if (-1 == ret)
{
	perror("write");
	exit(1);
}

//lseek(fd, 0, SEEK_SET);   //相对文件开头移动0个字节
//lseek(fd, strlen(buf) * -1, SEEK_CUR);  //相对当前位置,向前移动xxx个字节
lseek(fd, strlen(buf) * -1, SEEK_END);    //相对文件末尾,向前移动xxx个字节

memset(buf, 0, sizeof(buf));
ret = read(fd, buf, sizeof(buf));
if (-1 == ret)
{
	perror("read");
	exit(1);
}
printf("read from txt : %s\n", buf);

close(fd);

return 0;

}
6.void perror(const char *s); perror (“open_port”);
包含头文件(不可以掉了这个头文件):
#include <stdio.h>//包含perror的头文件
函数说明
  perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量error 的值来决定要输出的字符串。在库函数中有个error变量,每个error值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了error的值。perror函数只是将你输入的一些信息和现在的error所对应的错误一起输出。
7. man后参数(数字或者字母)作用介绍
8.man后面参数(数字或者字母)作用
1是普通的命令
2是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)
3是库函数,如printf,fread
4是特殊文件,也就是/dev下的各种设备文件
5是指文件的格式,比如passwd,就会说明这个文件中各个字段的含义
6是给游戏留的,由各个游戏自己定义
7是附件还有一些变量,比如向environ这种全局变量在这里就有说明
8是系统管理用的命令,这些命令只能由root使用,如ifconfig
n新文档,可能要移到更适合的领域。
o老文档,可能会在一段期限内保留。
l本地文档,与本特定系统有关的。

之后我发现自己对于函数用法还掌握的不熟练,应勤加记忆。

收获:
(1)我发现缓存区到磁盘实现的都是write操作,
反之磁盘到缓冲区则是read操作,且缓冲区属于内存,两个操作都是在内存和磁盘间操作。
(2)read函数读完数据后值为0,但也可以是所读完的数据的长度。
自我评价:多敲代码,上课多做笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值