C/C++ 在Linux系统中,解决无法往U盘创建文件和写入数据的问题

将自定义程序写入U盘引导区,并在真机执行 本文的实验可以实现如下功能:   按下计算机电源后,计算机屏幕输出一串自定义的字符串。 在linux系统下进行程序的编译并写入U盘。 1. 所需要的软件及工具  1)gcc,as86,ld86   gcc用于编译.C的程序,该程序用于将数据写入到U盘;   as86和ld86用于汇编和链接intel汇编语法下的汇编程序,该程序会写入数据到计算机的显示缓冲区,计算机会立即显示缓冲区的内容。 阅读详情

最近在Linux下做项目,遇到一个问题,困扰了我许久,就是无法用代码往U盘中创建文件或写入文件数据,现在解决了,记录下来,给遇到类似问题的朋友提供一个解决办法!


1. 问题

先来看一段简单的代码,用C语言的FILE往U盘中创建文件和写入数据:

printf("是否将登录信息加密保存到U盘中;\n点击“是”,下次插入此U盘将无需重复身份认证!");
/* 获取U盘路径 */
std::string filePath = "/" + "user.txt";	// 假设这里获得“U盘”路径
FILE *file = fopen(filePath.c_str(), "w");
if (file) {
    std::string str = "往文件中写入数据!";
    n = fwrite(str.c_str(), sizeof(char), str.length(), file);
    if (0 == n) {
        print("登录信息加密保存到U盘失败!");
    }

    fclose(file);
}

代码很简单,但在Linux下运行,却没法在U盘中创建user.txt文件和往这个文件中写入数据"往文件中写入数据!"。


2. 原因

原因很简单:数据同步!

Linux 系统中欲写入硬盘的资料有的时候为了效率起见,会写到 filesystem buffer 中,这个 buffer 是一块记忆体空间,如果欲写入硬盘的资料存于此 buffer 中,而系统又突然断电的话,那么资料就会流失了.

所以上面的程序代码,只是将文件和文件数据存入buffer中而已,还没有真正的写入U盘!


3. 解决 - sync

  1. Linux sync命令用于数据同步,sync命令是在关闭Linux系统时使用的。

    Linux中可以在终端直接调用:例如我是在国产Linux系统统信UOS测试:
    在这里插入图片描述
    sync 指令会将存于 buffer 中的资料强制写入硬盘中。

  2. sync是C语言的一个库函数
    调用sync可以将系统缓冲区(内存中)的数据写入到文件系统(磁盘)中。

    int sync(void);
    头文件:include < unistd.h >

    当同步成功返回0,否则返回-1。

    功能为将系统缓冲区的内容写回磁盘,以确保数据同步。

    修改上面代码,加上一个函数sync()即可!

    printf("是否将登录信息加密保存到U盘中;\n点击“是”,下次插入此U盘将无需重复身份认证!");
    /* 获取U盘路径 */
    std::string filePath = "/" + "user.txt";	// 假设这里获得路径
    FILE *file = fopen(filePath.c_str(), "w");
    if (file) {
        std::string str = "往文件中写入数据!";
        n = fwrite(str.c_str(), sizeof(char), str.length(), file);
        if (0 == n) {
            print("登录信息加密保存到U盘失败!");
        }
    
        fclose(file);
    }
    
    /* 数据同步 */
    #if defined (_WIN64) || defined (WIN32) || defined (_WIN32)
    
    #else
        sync(); // hui chang zhong yao!
    #endif
    

在Linux操作系统中,除非设置了自动同步,否则为了减少磁盘的写入量,延长磁盘寿命,写入文件时并不是即时写入到磁盘中,而是先写入内存,这段内存区域被称为系统缓冲区。在系统缓冲区数据累计到一定数量后(具体数量因系统实际设置而定),会有系统进程一次性写入所有缓冲数据。这样,如果意外断电,那么系统缓冲区内数据就会因此丢失。于是在写入一些重要数据时,都会在写入结束后进行一次sync()的调用,保证数据已经被写入磁盘,降低数据丢失或损坏的可能性。

这样就完美解决了!

注意:
这是C语言在Linux独有的一个函数,在Window是没有的,所以sync()不可以在Window系统中去使用!
所在在代码中我才会加上#if defined (_WIN64) || defined (WIN32) || defined (_WIN32)的判断。


4. 总结

这个是我在项目中遇到的问题,记录下来,也算是代码积累吧,以后就再也不会再踩一次这个坑了!
也希望给遇到此类问题的朋友提供一个解决办法的参考!

C/C++学习资源(百度云盘链接) C/C++学习资源 C语言入门到进阶(13.96G) 链接:https://pan.baidu.com/s/1py95EDg_yePWGLBAllxSwQ 提取码:cwdt 轻松掌握C语言视频教程(会打字就能学会)视频(5.23G) 链接:https://pan.baidu.com/s/1hLtedbJD2yryljpbGk0kQw 提取码:z1ul 超适合自学的C++视频_深入浅出版 链接:... 阅读详情

相关推荐

VSCode配置Keil插件解决C/C++头文件红色波浪线错误指南

在嵌入式开发中,集成开发环境(IDE)的智能感知功能对于提升编码效率至关重要。其工作原理依赖于语言服务器对代码的静态分析,通过解析包含路径和预定义宏来定位头文件与符号定义。当配置不当时,就会出现头文件找不到的红色波浪线错误,严重影响代码补全和跳转体验。这一问题的技术价值在于打通不同工具链的配置壁垒,实现编辑环境与编译环境的一致。在嵌入式开发场景,尤其是使用Keil MDK配合VSCode编辑器时,开发者常因路径配置缺失或错误而遇到此问题。本文聚焦于如何通过正确配置VSCode的c_cpp_propertie

weixin_30381317的博客 539

Linux C语言磁盘U盘容量读取、目录列表读取、文件夹大小读取

Linux C语言磁盘U盘容量读取、目录列表读取、文件夹大小读取C语言源代码 #include <stdio.h> #include <sys/statfs.h> #include <string.h> #include <dirent.h> #include <stdbool.h> #include <sys/stat.h> /****************************************************

SlaveOpen的博客 2450

VSCode远程开发Linux C/C++环境配置与排错指南

在跨平台C/C++开发中,远程开发环境配置是提升开发效率的关键技术。其核心原理是通过SSH协议将本地IDE与远程Linux服务器连接,实现代码编辑、编译、调试的无缝集成。这种技术方案的价值在于确保开发环境与部署环境的一致性,同时充分利用远程服务器的计算资源。在实际应用场景中,开发者常面临编译器路径配置、头文件查找、调试器启动等典型问题。本文聚焦于VSCode Remote-SSH扩展的配置实践,深入解析c_cpp_properties.json、tasks.json和launch.json等核心配置文件,并

weixin_34013044的博客 433

解决linux系统下U盘变成只读,无法新建文件夹

●步骤1 观察U盘插拔挂载点的变化 执行命令 tail -f /var/log/syslog 可能一直在运行 如果一直运行不用管 ●步骤2 查看U盘所在的文件系统 执行命令 df -h, 如/dev/sda1 我的U盘为/dev/sdc1 ●步骤3 umount 挂载位置 umount是取消挂载命令,U盘一般挂载在media文件夹下, 找到对应的名字即可 DA18-EBFA就是U盘挂载后的名字 umount /media/sinkdream/DA18-EBFA ●步骤4 修

weixin_43816121的博客 2506

C/C++教程目录及说明

C/C++教程专栏目录以及一些说明

余识- 1万+

PaddleOCR实战:给图片‘加个框’,轻松搞定小图和长图文字识别不准的难题

本文探讨了PaddleOCR在处理小图和长图时识别精度下降的问题,并提出通过图像边框预处理技术显著提升OCR识别效果。详细介绍了使用OpenCV实现智能边框添加的方法,包括核心原理、工程实践中的关键细节以及性能优化策略,帮助开发者轻松解决非常规尺寸图像的文本检测难题。

weixin_29313547的博客 186

C++实现U盘小偷(超详细版)

C++实现U盘小偷,一万五千字超详细代码解析,实现程序完成隐藏,多线程文件拷贝等

余识- 7258

C#.NET斗地主服务端核心架构与高性能实现

斗地主作为典型的实时对战棋牌逻辑,本质是状态驱动的分布式协同问题。其技术内核涵盖有限状态机建模、低延迟网络同步、无GC内存操作与轻量级AI决策等关键能力。在.NET平台下,借助Span<T>、ImmutableArray、命令/事件总线与内存池等特性,可构建出高吞吐(200+ QPS)、低延迟(<150ms)、强一致的可落地服务端。本文聚焦C#.NET生态中斗地主核心模块的设计取舍与压测验证,深入解析状态机驱动、CardSet结构体优化、Kestrel中间件锁、规则+概率混合AI等实战方案,为实时对战类业务

weixin_29726381的博客 345

linux c应用程序创建文件不成功问题,在 linux 下使用 CMake 构建应用程序

CMake 简介CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 autoconfig...

weixin_39729115的博客 461

COMSOL后处理与可视化

公众号→【COMSOL仿真交流】←更多精彩内容 后处理是采用COMSOL建模的一个重要环节。通过软件自带的可视化工具,可以快速方便的展现仿真结果。 COMSOL为使用者提供了多种后处理工具,包括表面图、切面图、等值线图、流线图、线图、体图等等。可按功能分为数据集(储存数据的地方)、派生值和表单(对数据进行进一步的操作)、绘图组合绘图类型(显示数据结果的地方)、导出数据与生成报告。   如果想用origin、matlab对模拟数据做进一步的处理,导出excel格式的模拟结果,这可以通过“导出

midiio的博客 4027

新手必看:TwinCAT死活扫不到倍福CX5020?别慌,先检查这3个地方(附静态IP配置)

本文详细介绍了TwinCAT软件无法扫描到倍福CX5020控制器的常见问题及解决方案。从网络连通性检查、系统环境配置到静态IP设置,提供了一套完整的排查流程和优化建议,帮助新手快速解决通信问题,确保设备稳定运行。

weixin_27219587的博客 362

Linux中的/proc文件系统详解(C/C++代码实现)

proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。 系中当前运行的每一个进程都有对应的一个目录在 proc 下,以进程的 PID 号为目录名,它们是读取进程信息的接口。

chen1415886044的博客 5337

Homebrew 必备软件清单:我的 macOS 开发环境搭建全记录

本文详细介绍了如何使用Homebrew在macOS上搭建高效的开发环境,包括基础配置、核心开发工具链、高效编码工具集等30个必备工具。通过Homebrew这一macOS缺失的包管理器,开发者可以一键安装命令行工具和GUI应用,大幅提升工作效率。文章还提供了日常维护命令和疑难问题解决方案,适合从新手到资深开发者的所有用户。

weixin_28836507的博客 353

【Linux系统】GDB 调试完全指南:从基础到进阶,解决 90% 的 C/C++ 调试问题

本文介绍了GDB调试工具的核心使用方法。基础部分包括编译配置(-g选项)、常用命令(断点设置、变量查看、单步执行等)和常见问题解决方案。进阶部分讲解了条件断点、观察点等高级调试技巧,帮助定位复杂问题。文章还总结了GDB调试的核心工作流程,从编译启动到问题定位的全过程。掌握这些内容可以解决大多数C/C++程序的调试需求,如需更深入功能可参考官方文档。全文提供了实用的调试技巧和常见问题应对方案,是GDB调试的实用指南。

HZzzzzLu的博客 1451

【卫星语音通信】神经网络语音编解码算法:AudioDec

最新研究表明,通过深度学习模型对语音信号进行智能压缩与重建,可在12 kbps码率下实现48 kHz采样率的高保真语音还原,其主观音质评分(MOS)可达3.9分(满分4.27分),远超传统参数编码技术。这意味着未来卫星电话的通话质量有望达到CD级水准,而蜂窝网络的语音业务带宽需求可降低60%以上,为蜂窝和卫星网络中的大规模物联网语音交互铺平道路。它的诞生为神经音频编解码技术带来了一次重要升级,有助于让未来实时语音交互更流畅、更清晰,也让我们进一步体验到人工智能与音频信号处理结合所带来的创新可能性。

u011376987的博客 1472

【问题解析】Matlab Function的易错点(Variable Size)

Matlab Function的易错点

CrazyRabbit的博客 9865

Linux_C实现将文件导出至U盘

#include #include #include #include #include #include #include #include #define BUFFER_SIZE 512 int main(int argc, char *argv[]) { int fdr,fdw; /* 文件描述符 fdr->源文件 fdw-&...

adwapfg6781的博客 399

西电计组实验二 运算器实验

算术逻辑运算实验 一.实验目的   1.了解简单运算器的数据传输通路。   2.验证运算功能发生器的组合功能。   3.掌握算术逻辑运算加、减、与的工作原理。   4.验证实验台运算的8位加、减、与、直通功能。   5.按给定数据,完成几种指定的算术和逻辑运算。 二.实验原理   算术逻辑单元ALU的数据通路如图2-1所示。其中运算器ALU181根据74LS181的功能用VHDL硬件描述语言编辑而成,构成8位字长的ALU。参加运算的两个8位数据分别为A[7…0]和B[7…0],运算模式由S[3…0]的16种

Polaris的博客 1万+

c/c++linux后台服务器开发如何提升?(路线图已备好)

随着业务市场的不断壮大,更便捷的开发语言也越来越受到市场的欢迎。Java,python还有新贵golang。 那c/c++语言的开发者市场在哪里。虽然说没有活干说的可能过于夸张,但是面临的事实就是比不了。可能初学一点Java,python等等就能找到一份不错的开发工作,但是如果你只会一点c,又不是校招的话,能找到哪些工作呢? C,c++不同于Java。Java的技术路线是比较固定的,学好技术栈...

资料qun832218493 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux头文件 C/C++头文件

-------------------------linux常用头文件如下:POSIX标准定义的头文件        目录项         文件控制    文件名匹配类型    路径名模式匹配类型        组文件    网络数据库操作        口令文件    正则表达式        TAR归档值    终端I/O    符号常量    文件时间    字符扩展类型-

wubin1124的专栏 4291

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++实现U盘自动检测与文件复制:事件驱动自动化工具开发详解

事件驱动编程是构建自动化系统的核心范式,它通过监听和响应特定事件来触发预设操作,从而实现流程自动化。其原理在于程序不主动轮询,而是注册为事件的观察者,当操作系统或硬件产生特定信号时,系统会回调注册的处理函数。这种模式的技术价值在于能高效利用系统资源,实现实时、低延迟的响应,尤其适用于需要与硬件或系统深度交互的场景。在文件管理、数据备份、设备监控等应用场景中,事件驱动架构能显著提升效率与可靠性。本文聚焦于利用C++和系统API,开发一个基于事件驱动的U盘自动检测与文件复制工具,详细解析了如何监听WM_DEVI

clhq71932的博客 522

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux下的C/C++编译环境构建(gcc make cmake 头文件目录 库文件目录)

下载安装GNU套件 sudo apt install gcc sudo apt install g++ sudo apt install make sudo apt install cmake 其实一般linux都是默认安装了gnu套件的,我们可能需要安装一下cmake即可。 因为c/c++项目的头文件包含目录,库文件目录都和文件系统有关,我们先了解一下linux的目录结构,看看linux都有哪些目录,每个目录中的主要内容是什么? 以下是对这些目录的解释: /bin: bin 是 Binarie

qq_41854911的博客 5332

linux中常用C/C++一些头文件的作用

当linuc C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。来自linux 2.4.20-18的内核代码中的/usr/include/asm/errno.h。#include    //该类不再支持,改用中的stringstream。#include //定义各种数据类型最值的常量。#include      //定义关于时间的函数。

long_steve的博客 780

linux C/C++常用头文件

1 数据类型 1.1 stdint.h uint8_t uint16_t uint32_t 1.2 stdbool.h  C语言中是没有bool类型的(C++中有),若要使用此类型,需要包含头文件stdbool.h。 false true 1.3 stddef.h csize_t// 机器相关的无符号类型,它被设计的足够大以便能表示内存中任意对象的大小。 ptrdiff_t// 表示指针相减的结果,是一种带符号类型。NULL 2 变量 2.1 errno.h errno 2.2 stdlib.h EXIT_

静叶思秋的博客 4200
上一篇: QT 写一个属于自己的消息弹窗MessageBox
下一篇: Linux 使用xmodmap禁用键盘按键(禁用Linux快捷键)
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值