文件IO:
标准IO和文件IO的区别:
1. 标准IO是库函数,是对系统调用的封装
2. 文件IO是系统调用,是Linux内核中的函数接口
3. 标准IO是有缓存的
4. 文件IO是没有缓存的
1. 操作步骤:
打开 -> 读/写 -> 关闭
2. 打开文件(open):
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:打开文件并且获得文件描述符
参数:
pathname:要打开的文件名
flags:标志位
O_RDONLY | 只读 |
O_WRONLY | 只写 |
O_RDWR | 读写 |
O_APPEND | 追加 |
O_ASYNC | 异步IO |
O_CREAT | 文件不存在创建 |
O_TRUNC | 文件存在截断(清0) |
返回值:
成功返回文件描述符(很小的非负整数)
失败返回-1
新生成的文件描述符总是为尚未使用的最小的非负整数
0:stdin 1:stdout 2:stderr
3. 关闭文件(close):
int close(int fd);
功能:将fd对应的文件描述符关闭
4. 读写(read/write)
1. write
ssize_t write(int fd, const void *buf, size_t count);
功能:向fd对应的文件中写入buf指向的count个字节
参数:
fd:文件描述符
buf:写入数据空间首地址
count:写入的字节数
返回值:
成功返回实际写入字节数
失败返回-1
2. read
ssize_t read(int fd, void *buf, size_t count);
功能:从文件描述符fd对应的文件中读取count个字节存放到buf开始的空间中
参数:
fd:文件描述符
buf:存放数据空间的首地址
count:想要读取数据字节数
返回值:
成功返回实际读到的字节数
失败返回-1
读到文件末尾返回0
作业:
1. 利用read和write实现文件内容的拷贝(将src.jpg中的内容拷贝到dst.jpg文件中)
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(void)
{int fsrc = 0;int fdst = 0;char tmpbuff[4096] = {0};int nret = 0;fsrc = open("src.jpg", O_RDONLY);if(fsrc == -1){perror("fail to open");return -1;}fdst = open("dst.jpg", O_WRONLY | O_TRUNC | O_CREAT, 0664);if(fdst == -1){perror("fail to open");return -1;}while(1){nret = read(fsrc, tmpbuff, sizeof(tmpbuff));if(nret == 0){break;}write(fdst, tmpbuff, nret);}close(fsrc);close(fdst);return 0;
}
2.1028:人口普查
#include <stdio.h>
#include <string.h>struct old
{char name[32];int year;int mon;int day;
};int main(void)
{struct old od[100000];int N = 0;int i = 0;int ret = 0;int max = 0;int min = 0;scanf("%d", &N);if(N>100000){printf("intput error\n");return -1;}for(i = 0; i < N; i++){scanf("%s %d/%d/%d", od[i].name, &od[i].year, &od[i].mon, &od[i].day);}for(i = 0; i < N; i++){if(od[i].year >= 1814 && od[i].year <= 2014){if(od[i].year == 1814 && (od[i].mon < 9 || od[i].day < 6)){ret = ret;for (int j = i; j < N - 1; j++){strcpy(od[j].name, od[j + 1].name);od[j].year = od[j + 1].year;od[j].mon = od[j + 1].mon;od[j].day = od[j + 1].day;}i--;N--;}else if(od[i].year == 2014 && (od[i].mon > 9 || od[i].day > 6)){ret == ret;for (int j = i; j < N - 1; j++){strcpy(od[j].name, od[j + 1].name);od[j].year = od[j + 1].year;od[j].mon = od[j + 1].mon;od[j].day = od[j + 1].day;}i--;N--;}else{ret++;}}}for(i = 0; i < ret-1; i++){if(od[max].year < od[i].year){max = i;}if(od[max].year == od[i].year && od[max].mon < od[i].mon){max = i;}if(od[max].year == od[i].year && od[max].mon == od[i].mon && od[max].day < od[i].day){max = i;}if(od[min].year > od[i].year){min = i;}if(od[min].year == od[i].year && od[min].mon > od[i].mon){min = i;}if(od[min].year == od[i].year && od[min].mon == od[i].mon && od[min].day > od[i].day){min = i;}}printf("%d %s %s\n", ret, od[min].name, od[max].name);return 0;
}