Linux系统编程(文件)———文件打开/创建写入读取
Posted 橙子果果
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统编程(文件)———文件打开/创建写入读取相关的知识,希望对你有一定的参考价值。
打开/创建文件
函数原型
//头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
pathname:是要打开的文件名(含路径,缺省为当前路径)
flags:
O_RDONLY 只读权限
O_WRONLY 只写权限
O_RDWR 可读可写权限
当我们附带权限后,打开的文件就只能按照这种权限来操作。
以上三这3个权限只能指定一个,下列权限是可选择的:
O_CREAT : 文件不存在则创建它,使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。
O_EXCL:如果同时指定了O_CREAT,则文件已经存在,则出错。
O_TRUNC:被打开的文件存在并且是以可写的方式打开的,则清空文件原有的内容。
O_APPEND:每次写都加到文件的尾部。
Mode:一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的访问权限。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd;
fd = open("./file1",O_RDWR);
if(fd == -1){
printf("open file1 failed\\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("create file1 success\\n");
}
}
printf("fd = %d\\n",fd);
return 0;
}
这里写一个简单的程序
1.首先程序必须包含头文件
2.定义一个fd来接收open的返回值
当程序有成功打开,返回一个非负整数
当程序没有则返回-1
3.打开file1文件,这里是没有file1文件所以open返回-1,
4.接着继续打开file1,这里没有就创建file1,以可读可写权限创建(0600),输出成功。
写入文件
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
写入成功,返回写入的字节数
写入失败,返回-1
fd 操作的文件(文件描述符)
buf 无类型的指针,一个缓冲区
count 写入文件的大小
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd;
char *buf = "Hello Ubuntu!";
fd = open("./file1",O_RDWR);
if(fd == -1){
printf("open file1 failed\\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("create file1 success\\n");
}
}
printf("fd = %d\\n",fd);
write(fd,buf,strlen(buf));
close(fd);
return 0;
}
这里就是上一个打开/创建文件代码的一个修改。
写入文件
在fd所指向的文件,把buf里的数据拿出来,写入其中,写入大小strlen(buf)
调用write这里需要包含头文件
计算buf的大小strlen也需要包含头文件。 #include <string.h>
最后需要关闭这个文件。(**)
包含头文件 #include <unistd.h>
刚开始没有file1,创建file1,并将buf中的数据写入file1中。
读取文件
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
读取成功,返回读取的字节数
读取失败,返回-1
读取fd中的数据到buf中,读取count个字节。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd;
char *buf = "Hello Ubuntu!";
fd = open("./file1",O_RDWR);
if(fd == -1){
printf("open file1 failed\\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("create file1 success\\n");
}
}
printf("fd = %d\\n",fd);
int n_write = write(fd,buf,strlen(buf));
if(n_write != -1){
printf("write %d bute to filr\\n",n_write);
}
// close(fd);
// fd = open("./file1",O_RDWR);
char *readBuf;
readBuf = (char *)malloc(sizeof(char)*n_write+1);
lseek(fd,0,SEEK_SET);
int n_read = read(fd,readBuf,n_write);
printf("read %d,context:%s\\n",n_write,readBuf);
close(fd);
return 0;
}
这里输出写入的字节数、读取的字节数和读取的数据。
****这里设计到一个光标的问题
write 之后,光标移动到文件的尾部,最后读取的数据肯定没有,所以这里要把光标移动到文件头,有两种方法:
(1)关闭文件,在打开文件
(2)移动光标到文件头
lseek(fd,0,SEEK_SET);
文件光标位置
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
offset 对whence的偏移值
whence 固定位置
SEEK_SET 文件头
SEEK_END 文件尾
SEEK_CUR 文件当前位置
最后的结果
首先没有file1文件
创建file1文件
输出fd返回的值
输出写入数据字节数
输出读取文件字节数和数据内容
以上是关于Linux系统编程(文件)———文件打开/创建写入读取的主要内容,如果未能解决你的问题,请参考以下文章