Linux系统编程学习相关博文
常规学习Linux系统编程的内容是复杂且繁多的,不推荐刚开始接触代码的朋友去学习,所以介绍Linux系统编程的目的主要是以应用开发为主。
在Windows底下,我们写一个word文档,就是创建/打开→编辑→保存→关闭这几个步骤,是用鼠标和键盘来完成的。
Linux一切皆文件,学习Linux文件编程关心的是如何用代码操作文件,实现文件创建,打开,编辑,保存关闭等自动化执行。
在Linux系统上,计算机如何帮助我们自动化完成Windows系统上的操作,接下来我们一起来探讨下
在Linux系统中,操作系统提供了一系列的API,详细看下图
打开 open()
读写 write() / read()
光标定位 lseek()
关闭 close()
#include
#include
#include
int open(const char *pathname, int flags, mode_t mode);
1. 函数功能:打开文件
2. 形参说明:
pathname:要打开的文件名(含路径,缺省为当前路径)
flags:O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 可读可写打开
当我们附带了权限后,打开的文件就只能按照这种权限来操作。
以上这三个常熟中应当只指定一个。下列常数是可选择的:
O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限
O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错
O_APPEND 每次写时都加到文件的尾端
O_TRUNC 用该属性打开文件时,如果这个文件中本来是有内容的,则将其长度截断为0
mode:创建模式,一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的访问权限
常见创建模式:0400,0200,0100,0600,0700
可读: R(4)
可写: W(2)
可执行: X(1)
0400为可读权限,0200为可写权限,0600为可读可写权限,以此类推
3. 返回值:打开成功返回文件描述符fd(每个文件的文件描述符都不一样),供接下来的操作使用,错误返回-1
#include
ssize_t write(int fd, const void *buf, size_t count);
1. 函数功能:往打开的文件中写入数据
2. 形参说明:
fd:打开文件返回的文件描述符
buf:缓冲区里要写入文件的内容
count:写入多少个字节的内容
3. 返回值:写入成功返回写入的字节数,0表示没有写入任何内容,错误返回-1
#include
ssize_t read(int fd, void *buf, size_t count);
1. 函数功能:往打开的文件中读取数据
2. 形参说明:
fd:打开文件返回的文件描述符
buf:从文件读取回来时的内容存放位置
count:读取多少个字节的内容
3. 返回值:读取成功返回读取到的字节数,0表示没有读取任何内容,错误返回-1
#include
#include
off_t lseek(int fd, off_t offset, int whence);
1. 函数功能:移动文件的光标
2. 形参说明:
fd:打开文件返回的文件描述符
offset:偏移值,负数往前偏移,正数往后偏移
whence:SEEK_SET 光标偏移到文件的开头
SEEK_END 光标偏移到文件的尾部
SEEK_CUR 光标在当前的位置不变
3. 返回值:成功返回结果偏移量,从文件开头开始,以字节为单位测量,错误返回-1
#include
int close(int fd);
1. 函数功能:关闭文件
2. 形参说明:
fd:要关闭文件的文件描述符
#include
#include
#include
int creat(const char *pathname, mode_t mode);
1. 函数功能:使用给定的模式 mode 打开 pathname 所指向的文件
2. 形参说明:
pathname:要打开的文件名(含路径,缺省为当前路径)
mode:创建模式
常见创建模式:
宏表示 数字
S_IRUSR 4 可读
S_IWUSR 2 可写
S_IXUSR 1 可执行
S_IRWXU 7 可读、写、址姓
3. 返回值:打开成功返回文件描述符fd(每个文件的文件描述符都不一样),供接下来的操作使用,错误返回-1
关于open与fopen这两个名字很类似的函数,对于很多初学者来说,不容易弄清楚它们有什么不同,只知道按照函数用法使用。
open和fopen的区别:
前者属于低级IO,后者是高级IO。
前者返回一个文件描述符,后者返回一个文件指针。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
对于这两者更详细的解释,请看链接博文:总结open与fopen的区别
#include
FILE *fopen(const char *path, const char *mode);
1. 函数功能:使用给定的模式 mode 打开 path 所指向的文件
2. 形参说明:
path:要打开的文件名(含路径)
mode:打开模式
r 只读方式打开一个文本文件
rb 只读方式打开一个二进制文件
w 只写方式打开一个文本文件
wb 只写方式打开一个二进制文件
a 追加方式打开一个文本文件
ab 追加方式打开一个二进制文件
r+ 可读可写方式打开一个文本文件
rb+ 可读可写方式打开一个二进制文件
w+ 可读可写方式创建一个文本文件
wb+ 可读可写方式生成一个二进制文件
a+ 可读可写追加方式打开一个文本文件
ab+ 可读可写方式追加一个二进制文件
3. 返回值:成功返回FILE类型指针(作用相当于前面open函数打开成功后返回的fd),错误返回NULL
#include
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
1. 函数功能:往文件流中写入数据
2. 形参说明:
ptr:要写入文件的数据流
size:一次性写入多少个字节的内容
nmenb:要写几次(跟上面size形参相关)
stream:打开文件返回的文件流(fopen成功后返回的FILE类型指针)
3. 返回值:成功时返回写入的次数(跟上面nmenb形参相关),错误或到达文件末尾时返回0
#include
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
1. 函数功能:从文件流中读取数据
2. 形参说明:
ptr:从文件读取回来时的内容存放位置
size:一次性读取多少个字节的内容
nmenb:要读取几次(跟上面size形参相关)
stream:打开文件返回的文件流(fopen成功后返回的FILE类型指针)
返回值:成功时返回读取的次数(跟上面nmenb形参相关),错误或到达文件末尾时返回0
#include
int fputc(int c, FILE *stream);
1. 函数功能:将字符c写到文件指针stream所指向的文件的中
2. 形参说明:
c:要写入的字符
stream:打开文件返回的文件流(fopen成功后返回的FILE类型指针)
#include
int fgetc(FILE *stream);
1. 函数功能:从文件指针stream指向的文件中读取一个字符。读取一个字节后,光标位置后移一个字节。
2. 形参说明:
stream:打开文件返回的文件流(fopen成功后返回的FILE类型指针)
3. 返回值:成功返回读取的字符
#include
int feof(FILE *stream);
1. 函数功能:检测文件结束符
2. 形参说明:
stream:打开文件返回的文件流(fopen成功后返回的FILE类型指针)
3. 返回值:如果文件还没到末尾,返回0,如果文件已到末尾,返回非零数
#include
#include
#include
#include
#include
#include
#include
int main()
{
int fd;
char *buf = "Hello World!";
fd = open("./file1", O_RDWR); //打开文件
if(fd == -1){
printf("open file1 failed, file1 does not exist\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 success, write %d byte for file1\n", n_write);
}
char *readBuf;
readBuf = (char *)malloc(sizeof(char) * n_write + 1);
//lseek(fd, 0, SEEK_SET); //两种移动光标的方法,下面的也可以
lseek(fd, -n_write, SEEK_END); //因为每次写入或读取内容都会让光标移动,所以在进行下次读取或写入内容时需要将光标移回文件头
int n_read = read(fd, readBuf, n_write); //从文件中读取内容
printf("read %d byte for file1, content is %s\n", n_read, readBuf);
close(fd);
return 0;
}
#include
#include
int main()
{
FILE *fp;
char *buf = "Hello World";
char readBuf[128] = {0};
fp = fopen("./test.txt", "w+"); //打开文件
fwrite(buf, sizeof(char), strlen(buf), fp); //读取文件,每次读sizeof(char)个字节,读strlen(buf)次
//fwrite(buf, sizeof(char)*strlen(buf), 1, fp);//读取文件,每次读sizeof(char)*strlen(buf)个字节,读1次
fseek(fp, 0, SEEK_SET); //把光标以到文件头
fread(readBuf, sizeof(char), strlen(buf), fp);//写入文件,每次写sizeof(char)个字节,写strlen(buf)次
//fread(readBuf, sizeof(char)*strlen(buf), 1, fp);//写入文件,每次写sizeof(char)*strlen(buf)个字节,写1次
printf("read data is %s\n", readBuf);
fclose(fp);
return 0;
}
#include
#include
int main()
{
FILE *fp;
char *str = "Hello World";
int len = strlen(str);
fp = fopen("./test.txt", "w+"); //打开文件
for(int i=0; i<len; i++){
fputc(*str++, fp); //往文件一位一位写入Hello World
}
fclose(fp);
return 0;
}
#include
#include
int main()
{
char c = '0';
FILE *fp;
fp = fopen("./test.txt", "r"); //打开文件
while( !feof(fp) ){ //没到文件末尾返回0,到文件末尾返回非零数
c = fgetc(fp); //一位一位获取数据
printf("%c", c);
}
//printf("\n");
fclose(fp);
return 0;
}