文件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;
}