Linux应用软件编程
常见的操作系统Windows界面友好使用方便但是闭源收费。PCLinux类Unix开源免费。常用于嵌入式平台Unix收费FreeRTOS小型嵌入式平台实时性文件编程IOIOinput/output 输入/输出为什么学习文件操作保存数据掉电数据不丢失保存在硬盘外存一切皆文件硬盘、鼠标、键盘、显示器、普通文件....Linux下的文件类型ls -l 查看Linux下的文件相关详情ll文件操作方法Linux下的两种文件操作方式标准IOC标准库提供的对文件的操作接口库函数如printf、scanf文件IOLinux内核提供的对文件的操作方法系统调用文件操作思想打开文件读写文件关闭文件标准IO学习标准C库提供的一堆对文件的操作接口函数----通过man手册打开文件 fopen读写文件 fgetc/fputc 、fgets/fputs、fread/fwrite关闭文件 fclosefopen函数文件流从文件中读写数据时体现出来的字节流。文件流指针FILE *。标准IO中对文件的操作都是面向文件流指针。#include stdio.h int main(int argc, char **argv) { FILE* fpfopen(1.txt,a); if(NULL fp) { printf(fopen error\n); return -1; } fclose(fp); return 0; }fclose函数fputc函数od -c 文本文件名 以字符方式查看该文件中的数据//向文件中写入“hello world” #include stdio.h int main(int argc, char **argv) { FILE* fpfopen(1.txt,a); if(NULL fp) { printf(fopen error\n); return -1; } /* fputc(H,fp); fputc(e,fp); fputc(l,fp); fputc(l,fp); fputc(o,fp); fputc(W,fp); fputc(o,fp); fputc(r,fp); fputc(l,fp); fputc(d,fp); */ char str[]{hello world}; char* pstrhello world; int i0; while(pstr[i]!\0) { fputc(str[i],fp); i; } fclose(fp); return 0; }fgetc函数//使用fgetc实现cat的功能将一个指定的文本文件内容输出到终端。 #include stdio.h int main(int argc, char **argv) { FILE* fpfopen(1.txt,r); if(NULL fp) { printf(fopen error\n); return -1; } int retfgetc(fp); if(EOF ret) { printf(error or end of file\n); return -1; } printf(%c,ret); while(EOF !ret) { retfgetc(fp); printf(%c,ret); } fclose(fp); return 0; }//使用fgetc和fputc实现文件的拷贝 #include stdio.h int main(int argc, char** argv) { if (argc 3) { printf(Usage:./a.out srcfile dstfile\n); return -1; } FILE* fp fopen(argv[1], r); FILE* fp2 fopen(argv[2], w); if (NULL fp) { printf(fopen error\n); return -1; } int ret 0; while ((ret fgetc(fp)) ! EOF) { fputc(ret,fp2); } fclose(fp); fclose(fp2); return 0; }fgetc和getcharret getchar() ret fgetc(stdin);fputc和putcharputchar(ret) fputc(ret, stdout);fgets函数gets和fgets的区别gets只能从终端读取数据fgets可以任意文件流指针中读取fgets会保留用户收入的\n字符gets不会读取\n字符fgets是安全的gets是危险的fgets最多读取size-1个数据最后一个位置存放字符串结束标志gets没有大小的限制。//利用fgets函数实现cat的功能 #include stdio.h int main(int argc, const char *argv[]) { FILE *fp fopen(./01_fopen.c, r); if (NULL fp) { printf(fopen error\n); return -1; } char buff[128] {0}; while (1) { char *p fgets(buff, sizeof(buff), fp); if (NULL p) { //printf(error or end of file\n); break; } printf(%s, buff); } fclose(fp); return 0; }fputs函数#include stdio.h int main(int argc, const char *argv[]) { FILE *fp fopen(1.txt, w); if (NULL fp) { printf(fopen error\n); return -1; } char *pstr how are you; char str[] {hahahahaha}; fputs(hello world, fp); fputs(pstr, fp); fputs(str, fp); fclose(fp); return 0; }//使用fgets和fputs实现文件的拷贝注意只能拷贝文本文件 #include stdio.h int copy_file(const char *srcname, const char *dstname) { int ret 0; FILE *fpsrc fopen(srcname, r); FILE *fpdst fopen(dstname, w); if (NULL fpsrc || NULL fpdst) { printf(fopen error\n); return -1; } char buff[256] {0}; while (1) { char *p fgets(buff, sizeof(buff), fpsrc); if (NULL p) { break; } fputs(buff, fpdst); } fclose(fpsrc); fclose(fpdst); return 0; } int main(int argc, const char *argv[]) { if (argc 3) { printf(Usage : ./a.out srcname dstname\n); return -1; } copy_file(argv[1], argv[2]); return 0; }fwrite函数#include stdio.h struct stu { int id; char name[32]; int score; }; int main(int argc, char **argv) { FILE* fpfopen(1.txt,w); if(NULL fp) { printf(fopen error\n); return -1; } struct stu s{1,zhangsan,99}; struct stu ss[]{{2,lisi,79},{3,wanger,90},{4,zhaowu,59}}; size_t sizefwrite(s,sizeof(struct stu),1,fp); printf(size is %ld\n,size); sizefwrite(ss,sizeof(struct stu),3,fp); printf(size is %ld\n,size); fclose(fp); return 0; }fread函数#include stddef.h #include stdio.h struct stu { int id; char name[32]; int score; }; int main(int argc, char **argv) { FILE* fpfopen(1.txt,r); if(NULL fp) { printf(fopen error\n); return -1; } struct stu ss[10]; size_t sizefread(ss,sizeof(struct stu),10,fp); printf(size is %ld\n,size); for(int i0;isize;i) { printf(%d %s %d\n,ss[i].id,ss[i].name,ss[i].score); } fclose(fp); return 0; }注意fread和fwrite可用来读写字符型文件也可以用来读写二进制文件fread和fwrite大多数场景用在读写固定大小的数据如结构体。文件流定位函数fseek函数int fseek(FILE *stream, long offset, int whence); 功能实现文件流中的文件位置定位符的偏移 参数 stream要偏移的文件流 offset偏移量 whence偏移的起始位置 SEEK_SET:文件开头 offset 0 SEEK_CUR:当前读写位置 offset可正可负 SEER_END:文件末尾 offset可正可负 返回值 成功0 失败-1 long ftell(FILE *stream); 功能获取当前流所在位置到文件开头的偏移量 void rewind(FILE *stream); 功能流复位将流定位到文件开头 获取文件的大小 fseek(fp, 0, SEEK_END); len ftell(fp); rewind(fp);#include stdio.h int main(int argc, char **argv) { FILE* fpfopen(1.txt,w); if(NULL fp) { printf(fopen error\n); return -1; } long offset0; fseek(fp,5,SEEK_SET); fputc(A,fp); offsetftell(fp); printf(offset is %ld\n,offset); fseek(fp,10,SEEK_CUR); fputc(B,fp); offsetftell(fp); printf(offset is %ld\n,offset); fseek(fp,-5,SEEK_CUR); fputc(C,fp); fseek(fp,5,SEEK_END); fputc(D,fp); rewind(fp);//将流复位到文件开头 fclose(fp); return 0; }其他int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); 功能将格式化后的数据输出到文件 int sprintf(char *str, const char *format, ...); 功能格式化后的字符串保存在内存

相关新闻

P1036 [NOIP 2002 普及组] 选数

P1036 [NOIP 2002 普及组] 选数

记录140 #include<bits/stdc.h> using namespace std; const int N25; // 定义常量N&#xff0c;表示n的最大范围&#xff08;题目n<20&#xff09; int n,k; // n表示整数个数&#xff0c;k表示需要选出的个数 int a[N]; // 记录n个整数 int ans0; // 记录和为素数…

2026/7/10 22:43:38阅读更多 →
别再背 slice 扩容公式了:1.18 真正改掉了什么

别再背 slice 扩容公式了:1.18 真正改掉了什么

2048 → 1280。 你没看错。在 Go 1.17 里&#xff0c;我把一个 cap1023 的 []byte append 一次&#xff0c;新 cap 是 2048&#xff1b;把同样的代码换成 cap1024&#xff0c;append 一次&#xff0c;新 cap 反而变成 1280。 old cap 只增加了 1&#xff0c;new cap 直接少了…

2026/7/10 22:43:38阅读更多 →
机器人领域“AGV调度优化”高价值专利案例:一种智能车间AGV调度优化方法

机器人领域“AGV调度优化”高价值专利案例:一种智能车间AGV调度优化方法

课题来源&#xff1a;某智能制造装备企业横向研发委托项目案例定位&#xff1a;面向智能车间多AGV路径冲突、传统静态调度响应滞后、多工序任务耦合下转运效率低、约束优化求解实时性差等痛点&#xff0c;开展融合空间路径映射、二次规划约束优化、递归神经动力学实时求解的车间…

2026/7/10 22:43:38阅读更多 →
witty-opencode故障排查手册:从安装失败到配置冲突的完整解决指南

witty-opencode故障排查手册:从安装失败到配置冲突的完整解决指南

witty-opencode故障排查手册&#xff1a;从安装失败到配置冲突的完整解决指南 【免费下载链接】witty-opencode AI agent client built on top of OpenCode, including the TUI frontend, agent backend, and SDK. 项目地址: https://gitcode.com/openeuler/witty-opencode …

2026/7/10 23:43:42阅读更多 →
openEuler-bootstrap完全配置指南:从环境搭建到成功构建

openEuler-bootstrap完全配置指南:从环境搭建到成功构建

openEuler-bootstrap完全配置指南&#xff1a;从环境搭建到成功构建 【免费下载链接】openEuler-bootstrap Build new openEuler architecture bootstrap rpms from scratch 项目地址: https://gitcode.com/openeuler/openEuler-bootstrap 前往项目官网免费下载&#xf…

2026/7/10 23:43:42阅读更多 →
Nginx服务部署

Nginx服务部署

基础部署&#xff1a;单实例Nginx快速启动部署前环境准备确保Docker环境就绪&#xff1a;docker --version验证安装&#xff0c;docker-compose --version检查编排工具。端口规划需避开系统占用&#xff0c;HTTP默认80端口&#xff0c;HTTPS默认443端口。如需SSL访问&#xff0…

2026/7/10 23:43:42阅读更多 →
openeuler/security-baseline路线图:未来功能增强与框架优化展望

openeuler/security-baseline路线图:未来功能增强与框架优化展望

openeuler/security-baseline路线图&#xff1a;未来功能增强与框架优化展望 【免费下载链接】security-baseline Hardening the system security to ensure that the system complies with various security hardening baselines to improve system security. Supports system…

2026/7/10 23:43:42阅读更多 →
编译原理:有限自动机

编译原理:有限自动机

📌目录 ⚖️ 有限自动机:词法识别的计算模型 🎯 一、有限自动机概述 (一)有限自动机的概念 (二)有限自动机的形式化定义 📦 二、确定性有限自动机(DFA) (一)DFA的定义 (二)DFA的运行 (三)DFA的表示 🌐 三、非确定性有限自动机(NFA) (一)NFA的定义 (二…

2026/7/10 23:43:42阅读更多 →
PilotGo-plugin-ELK与PilotGo平台集成:打造一体化运维管理

PilotGo-plugin-ELK与PilotGo平台集成:打造一体化运维管理

PilotGo-plugin-ELK与PilotGo平台集成&#xff1a;打造一体化运维管理 【免费下载链接】PilotGo-plugin-ELK ELK plugin for PilotGo. 项目地址: https://gitcode.com/openeuler/PilotGo-plugin-ELK 前往项目官网免费下载&#xff1a;https://ar.openeuler.org/ar/ Pil…

2026/7/10 23:38:42阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述&#xff1a;从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目&#xff0c;叫 skills4/skills &#xff0c;它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景&#xff1a;一个旨在展示或教授某种技能的仓库&#xff0c;本身却成了安…

2026/7/10 12:10:00阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示&#xff1a;因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战&#xff1a;从“黑箱预测”到“可信推理”2026年6月&#xff0c;第7届机器学习与趋势国际会议&#xff08;MLT 2026&#xff09;将在悉尼召开。会议议程中&#xff0c;“因果与可解释机器学习…

2026/7/10 12:29:21阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时&#xff0c;通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中&#xff0c;是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/10 4:59:05阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析&#xff1a;Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时&#xff0c;背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制&#xff0c;而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述&#xff1a;这不是又一个机器人抓取数据集&#xff0c;而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号&#xff1a;“Robo”直指物理世界中的具身智能体&#xff0c;“Wits”则毫不掩饰地指向人类最核心的认知能力&#xff1a;机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南&#xff1a;如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/10 13:39:09阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/10 22:20:33阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/10 17:29:22阅读更多 →