温习:
文件的拷贝(单个字符)(fgetc/fputc)
#include <stdio.h>
int main(void)
{
FILE* fp = NULL;
FILE* fq = NULL;
char ch = 0;
fp = fopen("str.txt","r");
if (fp == NULL)
{
perror("file to fopen!");
return -1;
}
fq = fopen("add.txt","w");
if (fq == NULL)
{
perror("file to fopen!");
return -1;
}
while(1)
{
ch = fgetc(fp);
if (EOF == ch)
{
break;
}
fputc(ch,fq);
}
fclose(fp);
fclose(fq);
return 0;
}
文件的拷贝(字符串)(fgets/fputs)
#include <stdio.h>
int main(void)
{
FILE* fstr = NULL;
FILE* fadd = NULL;
char teydefe[4096] = {0};
char* ret = NULL;
fstr = fopen("str.txt","r");
if (fstr == NULL)
{
perror("fils to fopen!");
return -1;
}
fadd = fopen("add.txt","w");
if (fadd == NULL)
{
perror("fils to fopen!");
return -1;
}
while(1)
{
ret = fgets(teydefe,sizeof(teydefe),fstr);
if (ret == NULL)
{
break;
}
fputs(teydefe,fadd);
}
fclose(fstr);
fclose(fadd);
return 0;
}
文件IO
一、标准IO和文件IO的区别
1.标准IO是库函数,是对系统调用的封装
2.文件IO是系统调用,是linux内核中函数的接口
3.标准IO是有缓存的
4.文件IO是没有缓存的
二、文件IO
1.操作步骤:
打开->读/写->关闭
2.打开文件:
open
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
功能:
打开文件并且获得文件描述符
参数:
pathname:要打开的文件名
flags:标志位
返回值:
成功返回文件描述符(很小的非负整数)
失败返回-1
新生成的文件描述符总是为尚未被使用的最小非负整数
3.关闭文件:
close
int close(int fd)
功能:
将fd对应的文件描述符关闭
三、文件IO的打开方式和标准IO的对应关系
“r” O_RDONLY
“r+” O_RDWR
“w” O_WRONLY | O_CREAT | O_TRUNC, 0664
“w+” O_RDWR | O_CREAT | O_TRUNC, 0664
“a” O_RDONLY | O_CREAT | O_APPEND,0664
“a+” O_RDWR | O_CREAT | O_APPEND,0664
四、文件描述符概念
英文:缩写fd(file descripotor)
是0-1023的数字,表示文件
0、1、2的含义
0:stdin 标准输入
1:stdout 标准输出
2:stderr 错误
五、读写read/write:
1.write
ssize_t write(int fd, const void *buf, size_t count);
功能:
向fd对应的文件中写入buf指向的count个字节
参数:
fd:文件描述符
buf:写入数据空间首地址
count:写入的字节数
返回值:
成功返回实际写入字节数
失败返回-1
练习:
将指定文件中写入buf指向的count个字节
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
int main(void)
{
int fd = 0;
char tmpbuff[4069] = {"how are you!"};
fd = open("a.txt",O_WRONLY | O_CREAT | O_TRUNC, 0664);
if (fd == -1)
{
perror("fail to open!");
return -1;
}
write(fd,tmpbuff,strlen(tmpbuff));
close(fd);
return 0;
}
易错点:
求字符串长度用sizeof,对二进制数据使用strlen;printf的字符最后没有‘\0’
2.read
ssize_t read(int fd, void *buf, size_t count);
功能:
从文件描述符fd对应的文件中读取count个字节存放到buf开始的空间中
参数:
fd:文件描述符
buf:存放数据空间的首地址
count:想要读取数据字节数
返回值:
成功返回实际读到的字节数
失败返回-1
读到文件末尾返回0
练习:
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
int main(void)
{
int fd = 0;
ssize_t count = 0;
char tmpbuff[4069] = {0};
fd = open("a.txt",O_RDWR);
if (fd == -1)
{
perror("fail to open!");
return -1;
}
count = read(fd,tmpbuff,sizeof(tmpbuff));
printf("count=%ld\n",count);
printf("tmpbuff=%s",tmpbuff);
close(fd);
return 0;
}
注意:源文件中会自带一个'\n',所以打印不同加'\n'