当前位置: 首页 > news >正文

Linux应用软件编程---文件操作1(fopen、fclose、fgetc/fputc、fgets/fputs)

Linux应用软件编程包含五部分:文件操作、多任务、网络编程、构建网络服务器、数据库。

文件操作

一、Linux下的文件类型

        b:块设备文件--->存储类设备(eg. 硬盘)

        c:字符设备文件--->如输入输出设备(eg. 鼠标、键盘、显示器)

        d:目录文件--->文件夹

        -:普通文件--->文本文件(eg. 字符、xxx.c、xxx.h)

                                        eg. 20250809 ---> ‘2’‘0’‘2’‘5’‘0’‘8’‘0’‘9‘

                           --->二进制文件(eg. xxx.jpg、xxx.png、a.out、xxx.mp4)

                                        eg. 2025 ---> 0000 0000 0000 0000 0000 0111 1110 1001

        l:软链接文件--->快捷方式

        s:套接字文件--->网络通信

        p:管道文件--->进程间通信

二、查找并举例说明

        可通过“ ls -l ” 或 “ ll ” 将当前目录下的所有文件详细信息显示出来。例如:

对于该信息:drwxrwxr-x  2  linux  linux  4096  1月  29   2024      link.c

   ·   dianhaod:文件类型   

   ·   rwxrwxr-x:文件操作权限       

                r:读red

                w:写write

                x:可执行

                -:无权限

                第一组 rwx :linux自己对文件的读写执行权限 ;

                第二组 rwx:同组用户对文件的读写执行权限 ;

                最后一组 r-x:其他人对文件的读写执行的权限 。

   ·   2:链接个数   

   ·   linux:用户名 

   ·   linux:组名   

   ·   4096:文件大小   

   ·   1月 29 2025:文件最后被修改的时间 

   ·    link.c:文件名称

三、文件操作思想

        1、打开文件

        2、读写文件

        3、关闭文件

四、文件操作的方法

        Linux 下的两种文件操作方法:标准IO 文件IO 两种。I--->input 输入, O--->output 输出。

        标准IO(库函数):C标准库提供的一套对文件操作的操作方法(eg. printf函数操作)。

        文件IO(系统调用):Linux内核提供的一套对文件操作的操作方法。

五、流

1、流

        stream 字节流。

2、文件流

        数据从文件流入、流出体现出来的字节流称为文件流。
标准IO: FILE --->文件流
FILE * --->文件流指针---->已打开文件

六、标准IO

1、标准IO的操作指令

        1)打开文件  fopen                

        2)读写/文件 

                fgetc/fputc :用于一个字符一个字符读写
fgets/fputs: 用于一行一行读写数据
fread/fwrite:用于块数据(批量数据)的读写

        3)关闭文件  fclose

        使用时,需包含头文件“ #include <stdio.h> ”

2、fopen 指令

          FILE *fopen(const char *pathname, const char *mode);

          功能:打开一个文件并获得一个文件流指针
参数:
pathname:打开得文件的文件名地址
mode:打开的方式
"r"        以只读的方式打开, 文件必须存在,不存在则打开失败。
"r+"      以读写的方式打开,文件必须存在,不存在则打开失败。
"w"       以只写的方式打开,文件存在则清空,文件不存在则创建。
"w+"     以读写的方式打开,文件存在则清空,文件不存在则创建。
"a"        以追加写的方式打开,文件不存在创建,文件存在追加写(file末尾)。
"a+"      以追加读写的方式打开,文件不存在创建,,文件存在追加写(file末尾)。
返回值:
成功:文件流指针:FILE *
失败:NULL

        eg. FILE *fp("./1.txt", "r"); 一只读的方式打开 1.txt 文件。

3、fclose 指令

        int fclose(FILE *stream)

        关闭文件,格式:fclose(利用fopen打开的文件名)。

4、fopen 与 fclose 的举例应用

        fopen 与 fclose 必须成对出现使用。

#include <stdio.h>int main(void)
{FILE *fp = fopen("./1.txt", "w+");//以w+ 只写的方式打开if(NULL == fp){printf("fopen error\n");return -1;}    printf("fopen file ok\n");fclose(fp);//关闭return 0;
}

七、标准IO读写操作

1、fgetc/fputc

        1)fgetc(读一次,文件流指针自动后移一位)

                int fgetc(FILE *stream);
功能:从文件中读取一个字符
参数:
stream:要读取的文件的文件流指针
返回值:
成功:读到的字符的ASCII值
失败:EOF
读到文件末尾:EOF

        2)fputc

                int fputc(int c, FILE *stream);
功能:向文件中写入一个字符
参数:
c:要写入的字符
stream:要写入的文件的文件流指针
返回值:
成功:写入的字符的ASCII值
失败:EOF (-1)

                eg. fputc('a', fp) 或  fputc(97, fp)

        3)例题

        (1)使用 fputc 指令向文件中写入 ” hello world!“

#include <stdio.h>
#include <string.h>int main(void)
{FILE *fp = fopen("./1.txt", "w");if(NULL == fp){printf("fopen error\n");return -1;}    printf("fopen file ok\n");char s[] = "hello world!";for(int i = 0; i < strlen(s); ++i){fputc(s[i], fp);}fclose(fp);return 0;
}

对文件编译运行后,可用 “ od -c 写入文件的文件名 ” 指令查看运行结果:

        (2)使用 fgetc 指令,读取文件中的内容

#include <stdio.h>int main(void)
{FILE *fp = fopen("./1.txt", "r");if(NULL == fp){printf("fopen error\n");return -1;}    int ret = fgetc(fp);if(EOF == ret){printf(" end of file or error\n");}while(EOF != ret){printf("%c", ret);ret = fgetc(fp);}puts("");fclose(fp);return 0;
}

对文件编译运行后的运行结果为:

        (3)使用 fgetc、fputc 指令,实现文件拷贝功能

#include <stdio.h>
//将 ./01_fopen.c 的内容拷贝到 ./dst.c 中去//./a.out ./01_fopen.c ./dst.c
int main(int argc, const char *argv[])
{if(argc != 3)//输入格式{printf("Usage: ./a.out <srcfile> <dstfile>\n");}FILE *srcfp = fopen(argv[1], "r");FILE *dstfp = fopen(argv[2], "w");if(NULL == srcfp || NULL == dstfp){printf("fopen error\n");return -1;}    while(1){int ret = fgetc(srcfp);if(EOF == ret){break;}printf("%c", ret);fputc(ret, dstfp);}puts("");fclose(srcfp);return 0;
}

对文件编译运行后,可用 “ cat 文件名 ” 指令将文件中的内容打印到终端,查看运行结果:

2、fgets/fputs

        1)fgets (自动换行)

        char *fgets(char *s, int size, FILE *stream);
功能:   从文件中读取一行数据
参数:
s : 用来存放读取到数据的内存空间首地址
size:希望从文件中读到的字节数
stream:要读取的文件流指针
返回值:
成功:返回s空间的首地址
失败:NULL
读到文件末尾:NULL

        eg. char s[100] = {0}; 开空间并初始化

        2)fputs (不将‘\0’写入)

        int fputs(const char *s, FILE *stream);
功能:向文件中写入字符串(不会写入'\0'字符)
参数:
s:字符串首地址
stream:要写入的文件流指针

        返回值:
成功:非负的整形数据
失败:EOF(-1)

        3)例题

        (1)使用 fputs 指令,向文件中写入内容:

#include <stdio.h>int main(void)
{FILE *fp = fopen("1.txt", "w");if(NULL == fp){printf("fopen error!\n");return -1;}fputs("hello world", fp);char str[32] = {"how are you"};fputs(str, fp);char *pstr = "hello world\n";fputs(pstr, fp);fclose(fp);return 0;
}

运行结果:

        (2)使用 fgets 指令实现文件内容在终端打印的功能

#include <stdio.h>int main(void)
{FILE *fp = fopen("1.txt", "r");//默认当前路径下if(NULL == fp){printf("fopen error!\n");return -1;}char s[100] = {0};char *p = fgets(s, sizeof(s), fp);if(NULL == p){printf("error or end of file\n");}printf("s = %s\n", s);fclose(fp);return 0;
}

运行结果为:

        (3)使用 fgets、fputs 指令实现文件内容拷贝的功能

#include <stdio.h>int main(int argc, char *argv[])
{if(argc != 3){printf("Usage:./a.out <srcfile> <dstfile>\n");return -1;}FILE *srcfp = fopen(argv[1], "r");FILE *dstfb = fopen(argv[2], "w");if(NULL == srcfp || NULL == dstfb){printf("fopen error!\n");return -1;}char s[100] = {0};char *p = fgets(s, sizeof(s), srcfp);while(p){fputs(s, dstfb);p = fgets(s, sizeof(s), srcfp);}fclose(srcfp);fclose(dstfb);return 0;

运行结果:

八、额外补充

1、man手册(共7章)

        man手册称为:linux程序员开发手册,共7章。

                第一章节:Linux命令
第二章节:系统调用(linux内核提供)
第三章节:库函数

        使用时,想要跳转至某章的操作” man 章节数字 指令名 “。

2、文件在终端打开

        od -c 文件名: 将文件中的内容以字符形式在终端打开。
sizeof(变量/数据类型):该变量/数据类型在内存中所占字节数。
strlen(字符串的首地址/字符型数组数组名):该字符串在内存中占的字节数,遇到'\0'结束。

        cat 文件名:将该文件中的数据内容打印到终端。也可用绝对路径表示文件。

3、主函数传参

        //./a.out aaa bbb ---> 实参
//形参:主函数中的参数
// argc : 程序运行时,给主函数传递的参数个数  3
// argv : 指针数组:argc个指针,分别指向了给主函数传递的实参
//        argv[0] ---->"./a.out"
//        argv[1] ---->"aaa"
//        argc[2] ---->"bbb"

【END】

http://www.dtcms.com/a/324727.html

相关文章:

  • 什么是浏览器标识?
  • 【Docker进阶实战】从多容器编排到集群部署
  • TSF应用开发与运维部署
  • 个人笔记Mybatis2
  • 医学统计(现况调查的统计分析策略1)
  • 电脑使用“碎片整理”程序的作用
  • 基于ECharts的智慧社区数据可视化
  • 【npm、yarn、pnpm】特点对比,按需选择
  • Java设计模式之开闭原则介绍与说明
  • 【RocketMQ 生产者和消费者】- ConsumeMessageOrderlyService 顺序消费消息
  • Vue.js设计于实现 - 概览(二)
  • 跑酷小游戏2.0
  • C语言(长期更新)第10讲:操作符详解(二)
  • 麻溜启动Oracle实例demo
  • 【渲染流水线】[几何阶段]-[归一化NDC]以UnityURP为例
  • 基于Spring Boot和WebSocket的实时聊天系统
  • Openlayers基础教程|从前端框架到GIS开发系列课程(21)geojson实现线要素和区要素
  • git merge的原理和过程,merge conflict产生的原因、处理的逻辑
  • 【话题讨论】GPT-5 发布全解读:参数升级、长上下文与多领域能力提升
  • MCP学习与实践
  • ESP32安装于配置
  • [激光原理与应用-216]:设计 - 皮秒紫外激光器 - 热管理设计,多维策略保障高效稳定运行
  • 腾讯云EdgeOne Pages深度使用指南
  • 计算机网络:什么是AD域
  • 线程的sleep、wait、join、yield如何使用?
  • 随想记——excel报表
  • XGBoost参数evals的作用及使用方法
  • 【图像算法 - 11】基于深度学习 YOLO 与 ByteTrack 的目标检测与多目标跟踪系统(系统设计 + 算法实现 + 代码详解 + 扩展调优)
  • 什么是缓存击穿、缓存穿透、缓存雪崩及其解决方案
  • Oracle lgwr触发条件