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系统编程(文件)———文件打开/创建写入读取的主要内容,如果未能解决你的问题,请参考以下文章

linux kernel 文件系统编程接口

用linux c语言编写 为一个文件里面的内容的每一行添加一个指定的字符

linux文件编程----系统调用

Linux系统编程---进程I/O

linux c语言编程

Linux系统编程(文件)———CP指令判断文件大小