linux系统编程(文件)———文件打开/创建写入读取(代码片段)

橙子果果 橙子果果     2022-12-07     687

关键词:

打开/创建文件

函数原型

	//头文件
	   #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系统编程|01-文件操作(代码片段)

一、文件操作方法linux中有两种方法可以操作文件:系统调用和c库函数。1.什么是系统调用?由操作系统实现并提供给外部应用程序的编程接口(API),是应用程序同系统之间数据交互的桥梁。C标准函数和系... 查看详情

linux系统编程|01-文件操作(代码片段)

一、文件操作方法linux中有两种方法可以操作文件:系统调用和c库函数。1.什么是系统调用?由操作系统实现并提供给外部应用程序的编程接口(API),是应用程序同系统之间数据交互的桥梁。C标准函数和系... 查看详情

linux系统编程(文件)———cp指令判断文件大小(代码片段)

CP指令判断文件大小CP指令比如要将src.c文件拷贝成des.c文件cpsrc.cdes.c思路1.打开src.c2.读取src到buf3.打开/创建des.c4.将buf写到des.c5.关闭两个文件测试代码:#include<stdio.h>intmain(intargc,char**argv)printf("totolparams:%d\\n", 查看详情

linux系统编程(文件)———cp指令判断文件大小(代码片段)

CP指令判断文件大小CP指令比如要将src.c文件拷贝成des.c文件cpsrc.cdes.c思路1.打开src.c2.读取src到buf3.打开/创建des.c4.将buf写到des.c5.关闭两个文件测试代码:#include<stdio.h>intmain(intargc,char**argv)printf("totolparams:%d\\n",a 查看详情

linux应用开发(代码片段)

...静态库-编译选项制作静态库动态函数库设计制作动态库系统调用方式文件编程文件描述符打开文件创建文件关闭文件读文件写文件文件定位复制文件描述符编写文件复制程序库函数方式文件编程函数学习打开文件关闭文件读文... 查看详情

linux应用开发(代码片段)

...静态库-编译选项制作静态库动态函数库设计制作动态库系统调用方式文件编程文件描述符打开文件创建文件关闭文件读文件写文件文件定位复制文件描述符编写文件复制程序库函数方式文件编程函数学习打开文件关闭文件读文... 查看详情

linux下高并发网络编程

...,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许... 查看详情

linux入门之磁盘管理文件系统

Linux入门之磁盘管理(2)文件系统linux分区构成完成之后,一般需要进行对其创建指定的文件系统,也就是我们常说的格式化,然后对其进行分区挂载,提供指定分区的访问点。不同的分区格式会在文件系统内部提供不同的对该分... 查看详情

linux创建自定义命令(代码片段)

...1、在/home目录用户文件夹下打开.profile文件vim~/.profileubuntu系统是~/.profile,centos系统用~/.bashrc2、在.profile文件中写入语法:alias[别名]=[指令名称]aliasll="ls-alh"3、然后执行source~/.profile若系统启动时 查看详情

linux创建自定义命令(代码片段)

...1、在/home目录用户文件夹下打开.profile文件vim~/.profileubuntu系统是~/.profile,centos系统用~/.bashrc2、在.profile文件中写入语法:alias[别名]=[指令名称]aliasll="ls-alh"3、然后执行source~/.profile若系统启动时 查看详情

linux创建自定义命令(代码片段)

...1、在/home目录用户文件夹下打开.profile文件vim~/.profileubuntu系统是~/.profile,centos系统用~/.bashrc2、在.profile文件中写入语法:alias[别名]=[指令名称]aliasll="ls-alh"3、然后执行source~/.profile若系统启动时 查看详情

在 Linux 系统上快速创建大文件

】在Linux系统上快速创建大文件【英文标题】:QuicklycreatealargefileonaLinuxsystem【发布时间】:2010-09-2010:43:32【问题描述】:如何快速在Linux(RedHatLinux)系统上创建大文件?dd可以完成这项工作,但是当您需要数百GB大小的文件进行测... 查看详情

c/c++在linux系统中,解决无法往u盘创建文件和写入数据的问题(代码片段)

最近在Linux下做项目,遇到一个问题,困扰了我许久,就是无法用代码往U盘中创建文件或写入文件数据,现在解决了,记录下来,给遇到类似问题的朋友提供一个解决办法!1.问题先来看一段简单的代... 查看详情

linux文件系统基础知识

参考技术Alinux文件系统基础知识汇总  1、linux文件系统分配策略  块分配(blockallocation)和扩展分配(extentallocation)  块分配:磁盘上的文件块根据需要分配给文件,避免了存储空间的浪费。但当文件扩充时,会造成文件中文... 查看详情

从 SaveFileDialog 创建、写入和打开文本文件

】从SaveFileDialog创建、写入和打开文本文件【英文标题】:Create,writetoandopenatextfilefromSaveFileDialog【发布时间】:2012-09-0513:57:22【问题描述】:我正在显示一个SaveFileDialog,当单击OK时,我正在创建新文件,向其中写入一些默认内容... 查看详情

linux系统创建文件报错“e297:writeerrorinswapfile“(代码片段)

异常突然发现无法在Linux系统下创建文件了,在任何目录下创建文件,更准确的说法是可以创建文件但是不能向文件写入内容,无论写入什么该文件的大小都为0。后面执行vimabc.txt创建文件,发现报错提示:E297... 查看详情

linux系统编程:基本i/o系统调用

 文件描述符进程每打开一个文件的时候,会获得该文件的文件描述符,而后续的读写操作都把文件描述符作为参数。在用户空间或者内核空间,都是通过文件描述符来唯一地索引一个打开的文件。文件描述符使用int... 查看详情

streamfilestreammemorystream的区别

...实例实际上代表一个文件流,使用FileStream类可以对文件系统上的文件进行读取、写入、打开和关闭操作。publicclassFileStream:Streampublic FileStream(stringpath,FileModemode,FileAccessaccess);path指明文件所在的路径信息;mode是FileMode的枚举值... 查看详情