Linux文件编程(打开/创建&写入&读取&移动光标)

目录

一、如何在Linux下做开发

1.vi编辑器

2.gcc编译工具

3.常用指令

二、文件打开及创建 

三、写入文件

四、读取文件

五、文件“光标”位置


一、如何在Linux下做开发

所谓文件编程,就是对文件进行操作,Linux的文件和Windows系统的文件大差不差,只不过Linux的所有文件都是在同一个根目录下,例如/home/book/Linux/file1表示根目录下的home文件夹里的book文件夹里的Linux文件夹里的file1文件。在此之前,我们先学习几个常用的指令。

1.vi编辑器

        vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器。

        在终端输入“vi”+“文件名” 就可以进入文本编辑页面,进入后默认是命令行模式,按“i”进入输入模式,左下角会提示“--INSERT--”,编辑完后按“esc”返回命令行模式,输入“:”+“wq”即可保存并退出编辑完的文件。

2.gcc编译工具

        GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。
        GCC 原名为 GNU C语言编译器,因为它原本只能处理 C 语言,但如今的 GCC ,不仅可以编译 C、C++ 和 Objective-C,还可以通过不同的前端模块支持各种语言,包括 Java、Fortran、Ada、Pascal、Go 和 D 语言等等。
        GCC支持多种硬件开发平台,还能进行跨平台交叉编译。此外,GCC是按模块化设计的,可以加入新语言和新CPU架构的支持。

看上图,a.c和a都是用户自己取的名字,-o表示直接生成可执行文件 ,但我在学习的过程中,看到了直接输入“gcc a.c”的指令,这时默认生成的可执行文件的名字为a.out。

3.常用指令


二、文件打开及创建 

函数

/*
 * 使用open函数必须包含以下头文件
 */
#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);

参数说明

open函数会返回一个非负的整数,我们称之为"文件描述符",后续我们对文件进行写入等操作都需要通过这个返回值来操作。 文件打开失败会返回-1。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

示例:

使用gcc编译工具编译.c文件后运行,预期在终端里看到fd的值。(这里open的第一个参数可写成./file1,表示当前文件夹下的file1文件,但需要注意当前所处文件夹下是否有file1文件) 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

如果要打开的文件不存在,则需要在open函数的第二个参数“|O_CREAT”,用操作,并且要输入第三个参数,表示创建时的权限。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
示例

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

“0600”表示创建的file1文件是个可读可写的文件,其他权限我暂时还不清楚。
 


三、写入文件

函数

/*
 * 调用write函数必须包含以下头文件
 */
#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

第一个参数就是我们之前提到的文件描述符,这个函数目的是将指针指向的内存里的count字节的数据写入文件描述符为fd的文件里。返回值是你写入的字节数,出现错误返回-1。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
示例

 注意write函数的第三个参数,计算字节长度时不能用sizeof,在Linux中,sizeof会计算地址的大小,Linux地址长度为8个字节。最后使用close函数关闭文件,传入文件描述符即可。


四、读取文件

函数

//使用read函数需包含以下头文件
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

读取成功会返回读取到的字节数,失败返回-1。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
示例

使用write函数时得到它的返回值,直接定义char *ReadBuf是个野指针,所以用malloc函数给ReadBuf分配内存,该指针是char型,用sizeof函数计算大小,有n_write个,所以*n_write。read函数也有它的返回值,打印到终端时预期打印“read 12,context:Hello World!”。
结果

发现读到了0个字节,内容也是空的,这里就要提到文件光标了,我们写入了内容后,光标是在我们写入内容的后面,这时候去读文件,自然是从光标位置往后读,所以读到是空。

解决办法: 
1.关闭文件后再打开,光标会从头开始(最原始的方法)

在写入内容后关闭再打开即可。
2.移动文件光标位置 (见下方)


五、文件“光标”位置

函数

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

函数作用:将文件读写指针相对whence移动offset个字节,第三个参数可以用函数提供的宏
·SEEK_SET        光标在文件头部
·SEEK_CUR        光标在当前位置
·SEEK_END        光标在文件尾部

offset表示与whence的偏移量,正数表示向后偏。
拿上面读取文件的问题来举例,只需要在读文件之前,加上这么一行代码

lseek(fd,0,SEEK_SET);

就能完美解决问题。

lseek函数的另一个用法:

函数的返回值是光标位置相对文件头部的偏移值,所以我们可以用这个函数来计算文件的大小。

示例:

int filesize = lseek(fd,0,SEEK_END);

补充:

创建文件还可以用creat函数

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sakabu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值