Linux系统编程——文件编程的学习

Linux系统编程学习相关博文

  1. Linux系统编程——进程的学习
  2. Linux系统编程——进程间通信的学习
  3. Linux系统编程——线程的学习
  4. Linux系统编程——网络编程的学习

一、概述

常规学习Linux系统编程的内容是复杂且繁多的,不推荐刚开始接触代码的朋友去学习,所以介绍Linux系统编程的目的主要是以应用开发为主。

1.Windows

在Windows底下,我们写一个word文档,就是创建/打开→编辑→保存→关闭这几个步骤,是用鼠标和键盘来完成的。

2. Linux

Linux一切皆文件,学习Linux文件编程关心的是如何用代码操作文件,实现文件创建,打开,编辑,保存关闭等自动化执行。

在Linux系统上,计算机如何帮助我们自动化完成Windows系统上的操作,接下来我们一起来探讨下

二、文件编程常用API

在Linux系统中,操作系统提供了一系列的API,详细看下图

打开		open()
读写		write() / read()
光标定位		lseek()
关闭		close()

三、API介绍

1. open函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

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记录待创建的文件的访问权限
	常见创建模式:04000200010006000700
	可读:	R(4)
	可写:	W(2)
	可执行:	X(1)
	0400为可读权限,0200为可写权限,0600为可读可写权限,以此类推
3. 返回值:打开成功返回文件描述符fd(每个文件的文件描述符都不一样),供接下来的操作使用,错误返回-1

2. write函数

#include <unistd.h>

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

1. 函数功能:往打开的文件中写入数据
2. 形参说明:
fd:打开文件返回的文件描述符
buf:缓冲区里要写入文件的内容
count:写入多少个字节的内容
3. 返回值:写入成功返回写入的字节数,0表示没有写入任何内容,错误返回-1

3. read函数

#include <unistd.h>

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

1. 函数功能:往打开的文件中读取数据
2. 形参说明:
fd:打开文件返回的文件描述符
buf:从文件读取回来时的内容存放位置
count:读取多少个字节的内容
3. 返回值:读取成功返回读取到的字节数,0表示没有读取任何内容,错误返回-1

4. lseek函数

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

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

1. 函数功能:移动文件的光标
2. 形参说明:
fd:打开文件返回的文件描述符
offset:偏移值,负数往前偏移,正数往后偏移
whence:SEEK_SET 光标偏移到文件的开头
		SEEK_END 光标偏移到文件的尾部
		SEEK_CUR 光标在当前的位置不变
3. 返回值:成功返回结果偏移量,从文件开头开始,以字节为单位测量,错误返回-1

5. close函数

#include <unistd.h>

int close(int fd);

1. 函数功能:关闭文件
2. 形参说明:
fd:要关闭文件的文件描述符

6. creat函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

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

四、标准C库API介绍

关于open与fopen这两个名字很类似的函数,对于很多初学者来说,不容易弄清楚它们有什么不同,只知道按照函数用法使用。

open和fopen的区别:
前者属于低级IO,后者是高级IO。
前者返回一个文件描述符,后者返回一个文件指针。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者。

对于这两者更详细的解释,请看链接博文:总结open与fopen的区别

1. fopen函数

#include <stdio.h>

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

2. fwrite函数

#include <stdio.h>

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

3. fread函数

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

1. 函数功能:从文件流中读取数据
2. 形参说明:
ptr:从文件读取回来时的内容存放位置
size:一次性读取多少个字节的内容
nmenb:要读取几次(跟上面size形参相关)
stream:打开文件返回的文件流(fopen成功后返回的FILE类型指针)
返回值:成功时返回读取的次数(跟上面nmenb形参相关),错误或到达文件末尾时返回0

4. fputc函数

#include <stdio.h>

int fputc(int c, FILE *stream);

1. 函数功能:将字符c写到文件指针stream所指向的文件的中
2. 形参说明:
c:要写入的字符
stream:打开文件返回的文件流(fopen成功后返回的FILE类型指针)

5. fgetc函数

#include <stdio.h>

int fgetc(FILE *stream);

1. 函数功能:从文件指针stream指向的文件中读取一个字符。读取一个字节后,光标位置后移一个字节。
2. 形参说明:
stream:打开文件返回的文件流(fopen成功后返回的FILE类型指针)
3. 返回值:成功返回读取的字符

6. feof函数

#include <stdio.h>

int feof(FILE *stream);	

1. 函数功能:检测文件结束符
2. 形参说明:
stream:打开文件返回的文件流(fopen成功后返回的FILE类型指针)
3. 返回值:如果文件还没到末尾,返回0,如果文件已到末尾,返回非零数

五、API的使用例子

1. 以open形势打开

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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;
}

2. 以fopen形势打开

#include <stdio.h>
#include <string.h>

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;
}

3. fputc函数例子

#include <stdio.h>
#include <string.h>

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;
}

4. fgetc,feof函数例子

#include <stdio.h>
#include <string.h>

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值