linux下操作文件的练习,分为打开、写、读和关闭文件,特此记录一下内容和碰到的问题。
#include <fcntl.h> #include <stdio.h> #include <unistd.h> int main(void) { //打开一个文件 int f; f = open("test.log", O_RDWR | O_APPEND | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); printf("%d\n", f); //写 char wbuf[13] = "Hello world!\n"; write(f, wbuf, sizeof(wbuf)); //将文件偏移量移到文件开始 lseek(f, 0, SEEK_SET); //读 char rbuf[12]; int size; size = read(f, rbuf, sizeof(rbuf) - 1); printf("%d\n", size); rbuf[size] = '\0'; printf("%s\n", rbuf); //关闭文件 close(f); return 0; }
打开文件函数open第二个参数表示打开文件的权限,其中
O_RDWR表示读写方式
O_APPEND表示已追加的方式进行写
O_CREAT表示文件不存在的时候会进行创建
第三个参数表示创建文件时文件的权限,其中
S_IRWXU表示user权限是rwx
S_IRWXG表示group权限为rwx
S_IRWXO表示other权限为rwx
当然这不是最后文件的权限,最后的文件权限还和umask有关,关于umask可以参考:linux中的umask含义理解。
写文件函数write指明写入的字符串和长度。写完文件后lseek函数将文件偏移量会在文件尾,下面读取文件的时候如果不将偏移量移到开头,则读不到内容。另外使用O_APPEND的方式打开文件也会使得偏移量指向文件尾。
读取文件指明接收的字符创和读取的长度。读取时发现一个乱码问题,是因为rbuf没有结束字符\0导致,所以这里只读取11个字符,最后一个字符定为\0表示结束。
最后关闭文件。
测试的过程中还碰到如下文件:
file/fnctl.c:14:2: warning: implicit declaration of function 'write' is invalid in C99 [-Wimplicit-function-declaration] write(f, buf, 12); ^ 1 warning generated.
最后发现是因为没有
#include <unistd.h>
所致。