news 2026/8/29 18:49:38

从零开始的敲代码生活--Linux应用软件(文件操作基础1)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零开始的敲代码生活--Linux应用软件(文件操作基础1)

一、文件基础概念

1. 文件

程序变量、数组、数据结构存放在内存;文件存储在外存(硬盘)。

对比项内存外存(硬盘/文件)
读写速度比内存慢
数据保持程序执行结束、掉电数据丢失掉电数据不丢失
空间/价格空间小,价格昂贵空间大,相对内存价格便宜

文件用于长期保存掉电不丢失的数据。Linux一切皆文件,硬件也通过文件接口给应用层操作。

2. Linux下文件类型

ls -l 文件名可以查看文件信息。示例:

-rwxrwxr-x 1 linux linux 19856 Aug 14 19:20 a.out

Linux一共7种文件类型:

标志类型说明示例
bblock 块设备文件存储类文件硬盘
ccharacter 字符设备文件字符设备鼠标、键盘、显示器
ddirectory 目录文件文件夹普通文件夹
-regular 普通文件普通文件main.c、txt、jpg、可执行程序
llink 软连接文件快捷方式(符号链接)
ssocket 套接字文件网络编程
ppipe 管道文件进程间通信

普通文件分为:

  • 二进制文件:存储二进制01序列,如a.out、png、mp3
  • ASCII文本文件:存储字符,如.c、.h、.txt,可用catod -c查看

3. Linux下文件操作方法

  • 标准IO:C库函数,#include <stdio.h>,例如printfscanf
  • 文件IO:系统调用,由Linux内核提供接口

文件操作通用流程:

  1. 打开文件
  2. 读写文件
  3. 关闭文件

man手册使用:

  1. Linux命令:man 1 ls
  2. 系统调用:man 2 open
  3. 库函数:man 3 fopen

二、标准IO

文件流:读写过程中的字节流,标准IO操作面向FILE*文件流指针。

系统默认预先打开三个流:

文件流对应设备说明
stdin键盘标准输入流
stdout终端显示屏标准输出流
stderr终端显示屏标准错误流

1. fopen 打开文件

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

参数:

  • pathname:文件路径名称
  • mode打开模式
mode含义
"r"只读,文件必须存在
"r+"读写,文件必须存在
"w"只写;不存在创建,存在清空原有内容
"w+"读写;不存在创建,存在清空原有内容
"a"追加只写;不存在创建,写在文件末尾
"a+"读写;读从开头,写向末尾追加

返回:成功返回FILE*,失败返回NULL

2. fclose 关闭文件

int fclose(FILE *stream);

成功返回0,失败返回EOF(-1)

注意:文件用完必须关闭,否则产生文件描述符泄露。

3. fputc 写入单个字符

int fputc(int c, FILE *stream);

putchar('a')等价于fputc('a',stdout)。 返回成功字符,失败返回EOF

4. fgetc 读取单个字符

int fgetc(FILE *stream);

读到文件末尾/出错返回EOF

fgetc+fputc实现文件拷贝(命令行传参argc/argv)

#include <stdio.h> int main(int argc, const char *argv[]) { if (argc < 3) { printf("Usage: ./a.out srcfile dstfile\n"); return -1; } FILE *fpsrc = fopen(argv[1], "r"); FILE *fpdst = fopen(argv[2], "w"); if (NULL == fpsrc || NULL == fpdst) { printf("fopen error\n"); return -1; } int ret = 0; while (1) { ret = fgetc(fpsrc); if (EOF == ret) { break; } fputc(ret, fpdst); } fclose(fpsrc); fclose(fpdst); return 0; }

5. fputs 写字符串

int fputs(const char *s, FILE *stream);

将字符串写入文件,不会写入'\0';成功返回>=0,失败返回EOF

6. fgets 读取一行

char *fgets(char *s, int size, FILE *stream);

最多读取size‑1字节,末尾自动补'\0';读到换行会保存换行符。

gets不安全不推荐使用;scanf遇到空格、tab、换行停止读取。

fgets+fputs实现文件拷贝函数

int file_cp(const char *srcfile, const char *dstfile) { FILE *fpsrc = fopen(srcfile, "r"); FILE *fpdst = fopen(dstfile, "w"); if (NULL == fpsrc || NULL == fpdst) { printf("fopen error\n"); return -1; } char buff[1024] = {0}; while (NULL != fgets(buff, sizeof(buff), fpsrc)) { fputs(buff, fpdst); } fclose(fpsrc); fclose(fpdst); return 0; }

fgets/fputs适合文本文件,不适合二进制文件。

7. fwrite 块写

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

向文件写入nmemb个、每个大小size字节的数据单元;返回成功写入的单元个数。

8. fread 块读

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

从文件读取nmemb个单元到ptr内存;返回实际读到的单元数量。

9. 文件流定位

fseek:重定位读写位置

int fseek(FILE *stream, long offset, int whence);
  • SEEK_SET:从文件起始位置偏移
  • SEEK_CUR:从当前位置偏移
  • SEEK_END:从文件末尾偏移

ftell:获取当前距离文件开头字节偏移

long ftell(FILE *stream);

rewind:将文件流直接回到文件开头

void rewind(FILE *stream);

获取文件大小示例

fseek(fp, 0, SEEK_END); len = ftell(fp); rewind(fp);

三、时间相关函数

头文件:#include <time.h>

1. time 获取时间戳(秒数)

time_t time(time_t *tloc);

获取从1970‑01‑01 00:00:00到当前的秒数。

2. ctime 将时间戳转为字符串时间

char *ctime(const time_t *timep);

3. localtime 将时间戳转为tm日历结构体

struct tm *localtime(const time_t *timep);

struct tm结构体成员:

struct tm { int tm_sec; /* 秒 0‑60 */ int tm_min; /* 分 0‑59 */ int tm_hour; /* 时 0‑23 */ int tm_mday; /* 日期 1‑31 */ int tm_mon; /* 月份 0‑11 */ int tm_year; /* 年份,实际=tm_year+1900 */ int tm_wday; /* 星期 0‑6,周日=0 */ int tm_yday; /* 一年中的第几天 */ int tm_isdst; /* 夏令时 */ };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 18:47:29

Windows 安装 OpenClaw 图文实操教程,TopClaw内置六万技能免费

安装前的准备&#xff0c;这些坑我帮你踩过了 最近在折腾OpenClaw&#xff0c;一开始我以为就是普通软件&#xff0c;双击下一步就完事了。结果发现绕了不少弯子&#xff0c;为了让大家少走弯路&#xff0c;我把自己实操验证过的步骤整理出来&#xff0c;新手照着抄作业就行。先…

作者头像 李华
网站建设 2026/8/29 18:47:10

DeepSeek LeetCode 15.三数之和 Rust实现

下面是 LeetCode 15「三数之和」的 Rust 实现&#xff0c;使用排序 双指针&#xff0c;时间复杂度 O(n)。rust impl Solution {pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {let mut ans: Vec<Vec<i32>> Vec::new();let n num…

作者头像 李华
网站建设 2026/8/29 18:46:03

基于R Shiny与Leaflet的拍照赚钱数据地图可视化应用开发实践

1. 项目概述&#xff1a;从“拍照赚钱”到数据洞察的桥梁几年前&#xff0c;一个名为“拍照赚钱”的商业模式曾引发不少讨论。其核心逻辑并不复杂&#xff1a;平台发布线下任务&#xff08;比如去某个超市拍下特定货架的照片&#xff09;&#xff0c;用户接单前往完成并拍照上传…

作者头像 李华
网站建设 2026/8/29 18:44:39

本地文件搜索工具免安装不建索引秒出结果

TommSearch 昨天聊了dnGrep&#xff0c;主打全文内容搜索&#xff0c;连压缩包都能钻进去搜。今天这款走的是另一个路子——极速文件名搜索。两个工具搭配着用&#xff0c;一个搜内容&#xff0c;一个搜文件名&#xff0c;基本就把电脑搜索这件事全覆盖了。 不建索引&#xf…

作者头像 李华
网站建设 2026/8/29 18:42:22

英飞凌推出20Gbps通用USB外设控制器,补齐设备端带宽短板

记得刚入行那会儿&#xff0c;我还在跟 USB 2.0 的 480Mbps 打交道&#xff0c;调一个批量传输端点都得翻半天手册。谁能想到&#xff0c;现在行业已经卷到外设控制器直接上 20Gbps 了。英飞凌官宣推出业界首款 20Gbps 通用 USB 外设控制器&#xff08;Universal USB Periphera…

作者头像 李华
网站建设 2026/8/29 18:40:57

**《金字塔集群具身智能架构》开源声明与授权协议**

《金字塔集群具身智能架构》开源声明与授权协议 1. 开源初衷与愿景 为推动具身智能&#xff08;Embodied AI&#xff09;领域的底层技术革新&#xff0c;打破传统“大模型硬扛”与“死板算法”的瓶颈&#xff0c;本团队决定将自主研发的“基于 Linux 实时内核的金字塔式集群 AI…

作者头像 李华