一个有关fstream类的bug

C++文件操作全解析:从fstream基础到高效读取实战 文件操作是编程中处理数据持久化的基础技术,其核心在于建立程序与外部存储之间的数据通道。在C++中,这一功能主要通过文件流(fstream)类族实现,其原理是利用流对象作为数据搬运的管道,通过指定不同的文件模式(如ios::in、ios::out、ios::binary)来控制读写行为与数据格式。掌握文件操作的技术价值在于构建健壮、可靠的应用程序,避免因权限、路径或模式错误导致的数据丢失或程序异常。典型的应用场景包括配置文件读取、日志记录、数据序列化及二进制资源加载。本文将深入探讨C++文件流中ifstrea 阅读详情
 一个有关fstream类的bug

    近日写程序需要读出文件,对读出的内容作些修改,再写回到文件中。
突然发现一个莫名其妙的问题,写回去的时候居然在文件末尾增加了几个字
符。感到很不可思议。具体代码如下:

fstream infile;
        infile.open("c://test.txt", ios::in);
        infile.seekp(0, ios::end);
        int iFileLen = infile.tellp();
        cout << "File len:" << iFileLen << endl;
        char * pBuff = new char[iFileLen + 1];
        memset(pBuff, 0, iFileLen + 1);
        infile.seekp(0, ios::beg);
        infile.read(pBuff, iFileLen);
        infile.close();

        fstream outfile;
        outfile.open("c://test1.txt", ios::out|ios::trunc);
        outfile.write(pBuff, iFileLen);
        outfile.close();
        delete[] pBuff;

    在文件test.txt中输入一个字符'.'以及一个回车键,用UE打开,发现该
文件有三个字符,十六进制表示如下:2E 0D 0A。而在屏幕中打印出来的文件
大小也是3。可是文件test1.txt文件大小却变成了4,其十六进制表示变成了:
2E 0D 0A 00。莫名其妙的多了一个字节。可是明明写入的字节数应该是3啊。
怎么写到文件中去却变成了4了呢?很奇怪的问题。难道是write的问题?于是
我换了一种写文件方式,改成下面的方式:
        for(int i = 0; i < iFileLen; i++)
           outfile << pBuff[i];
但是结果仍然同上,仍然多了一个字节。于是感到可能是fstream这个类的问
题,以前也发觉该类在使用seekp时会出错。于是改成用c语言的文件流读写
操作,具体实现如下:

       FILE * f = fopen("c://test.txt", "r");
fseek(f, 0, SEEK_END);
int len = ftell(f);
printf("the file len: %d /n", len);
fseek(f, 0, SEEK_SET);
        char  * p = new char[len + 1];
memset(p, 0x00, len + 1);
fread(p, sizeof(char), len, f);
        fclose(f);

        f = fopen("c://test1.txt", "w");
        fwrite(p, sizeof(char), len, f);
        fclose(f);
        delete[] p;

    可惜结果仍然没变。这就比较奇怪了。怎么会出现这种情况呢?明明文件
大小为3,为何写到另外一个文件中去却变成了4呢?于是在程序读出test.txt
文件内容的下一行添加了一条语句:
        for(int i = 0; i < len; i++)
            cout << (int)p[i];
    结果在屏幕上显示的居然是这个结果:46 10 0。居然没有把0A输出。而是
输出了0。我突然想到fread返回的结果是真正读到数据p中的长度,于是我又改
变了一下上面的程序,将fread的结果打印出来:
        cout << fread(p, sizeof(char), len, f) << endl;
结果果然是2,而不是想当然的3。原来在window下,回车换行的两个字符读到
一个数组中去时,只会在数组中保存一个字符:0D。但是用feek来计算文件长
度时返回的却是文件的实际大小,而不是真正读入到数组中的值。
    于是,采用fstream类来写入的时候,文件中每多一个回车换行,实际用
read函数读到字符数组中的个数就减少一个。而前面我仍然用文件长度来将读
到字符数组中的内容写到某个文件中去时,显然会多写入一些字符。而这些多
写入的字符值由于一开始用memset置为0,所以最后在test1.txt文件中就多了
几个值为0的字符。
    显然,用fstream类是无法解决这个问题的。因为它没法返回真正读到字符
数组中的个数。所以当写回文件时会多写入字符。除非在读文件时判断有多少
回车换行符,从而在总文件大小中减去这部分值,才是真正读到字符数组中的
值。所以,解决这个问题只能使用fread函数,因为该函数提供了一个返回参数
来告知真正读到字符数组中的字符个数(或者使用window提供的API:ReadFile)
该函数也同样提供了一个返回参数。
    因此,在window下读出一个文件时,遇到回车换行两个字符,只会读入一个
字符:0A。以后在处理时,只能判断是否是0A来判断换行,而不能判断0d来判断
是否换行。而读出文件的真正大小需要用fread函数来得知。
如何在离线的电脑上部署一个本地Deepseek(使用ollama) 例如,如果您的显卡显存为 16GB,官方推荐使用 32b 大小的 DeepSeek 模型。请根据您的硬件配置选择适合的模型版本,以获得最佳性能。首先我们需要将ollama和chatbox的安装包,Deepseek模型文件通过U盘或者光盘的形式导入到这台不能联网的电脑上。按照时间排序,找到最大的那个文件,就是gguf格式的模型,复制出来,改名为qwen2.5-coder0.5b.gguf。:基于开源模型(如 QWEN 和 LLAMA)微调,参数量从 1.5B 到 70B 不等,适合本地硬件部署。 阅读详情

相关推荐

结构方程模型amos的操作与应用pdf_AMOS结构方程进行医学问卷量表分析教程(一阶简单路径效应分析)...

在生物医药的数据统计分析中,要研究量表和量表之间的关系时候,由于维度题项较多,而不再是单一的变量,因此我们要使用AMOS结构方程进行处理。​ 举个例子,比如对住院患者的相关研究,设置了患者在住院期间的适应性量表和自我效能的量表,想考察患者适应性与自我效能之间的影响关系,或者说适应性的强弱是否会影响到患者自我效能的高低。此时适应性量表和自我效能量表都不是单一的变量,而是有N个题项构成的...

weixin_39637614的博客 7711

文件的读写基本操作

一、文件是计算机中数据持久化存储的表现形式 读写文件标准操作格式1: 1、打开文件:file1 = open('文件名','读写模式') 2、操作文件 3、关闭文件:file1.close() 文件操作完毕后必须关闭,否则长期保持对文件的连接状态,造成内存溢出的现象发生 读写文件操作格式2: # 1、打开文件 file1 = open('demo.txt','w') # 2、操作文件 file1.write('hello world') # 3、关闭文件 file1.close() 1、打开文件:wi

范高伦的博客 1万+

PC微信逆向:破解聊天记录文件!_读取别人pc微信msg文件

本文详细介绍了PC版微信数据库的解密方法,总结了前人经验并补充了关键细节。通过OllyDbg调试工具从微信内存中获取32字节加密密钥,使用C++结合OpenSSL库实现解密程序。重点解决了开发环境配置问题,包括Visual Studio项目设置和OpenSSL库的版本适配,将原本固定的数据库路径改为参数化输入,提高了工具的通用性。该方案为电子取证中的微信数据提取提供了完整的技术路径,避免了研究者重复探索已解决的问题。

zz96405784848的博客 9773

fstream对象重复使用需注意clear的调用,否则会出错

 ifstream对象如果重复使用,须注意在使用之前先调用clear函数,否则会出错表现为:代码一:==================================================== ifstream fin("x.txt"); if(fin.fail()) {  cout  } fin.close(); fin.open("y.txt"); if(fin.fail()) {

zdragon2002的专栏 4393

路由工具之策略路由policy-based-routing、MQC三板斧流分类、流行为、流策略

PBR(Policy-Based Routing,策略路由)策略路由可理解为控制路由,因为PBR策略的优先级高于传统路由表的转发,所以它主要用于影响数据包转发的技术。

Hades_Ling的优快云博客 5583

使用 Python+PaddleOCR 实现图文识别:从入门到精通

在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等。PaddleOCR 是百度开源的一款强大的 OCR 工具包,它集成了多种先进的算法和模型,能够高效准确地进行图文识别。本文将详细介绍如何使用 PaddleOCR 和 Python 实现图文识别,并给出具体的代码和步骤。

爱搬砖的程序猿 5476

fstream的使用问题

//问题十八: //使用fstream对象时,先读再写就会出问题,需要流指针重新定位才能写。先写再读没有问题,流指针会自动右移一位再读 #include #include using namespace std; int main() { fstream stream("hello.txt"); if(!stream) { cerr exit(-1); } cha

享受开发技术,享受计算机科学 833

TT电机、310电机、370电机在智能小车与机器人中的性能对比与选型指南

本文深入对比了TT电机、310电机和370电机在智能小车与机器人项目中的核心性能差异。文章从尺寸、扭矩、转速、电压电流等关键参数入手,结合不同应用场景(如入门小车、竞技机器人、机械臂),提供了清晰的选型指南和驱动控制建议,帮助开发者根据项目需求选择最合适的电机方案。

weixin_29065015的博客 411

C++ fstream使用文件打不开解决记录

C++ fstream使用文件打不开解决记录 头文件 1.路径问题 C:/Users/lac/Desktop/data/test.bin 需要将“/”转换为“//” 例: QString strFIle("C:/Users/lac/Desktop/data/test.bin"); strFIle = strFIle.replace(QRegExp("\\/"), "//"); 文件关闭 close() 打开文件后记得关闭 !!! 中途要退出啥的也记得关闭文件,之前由于中途退出时没有关闭文件,导致下一

yinyinyinyinyi的博客 1291

汽车电子零部件(14):TMS热管理系统

TMS(thermal management system)热管理系统,这是新能源汽车诞生后随之而产生的一种新汽车零部件,一旦热管理失控会触发自燃,这种现象也是对EV来说是件头疼的事。汽车的热管理系统(TMS)是一个关键部件,有助于调节汽车电池组、车厢和其他车辆系统的温度。TMS的主要目的是在驾驶过程中保持最佳的电池性能和乘客舒适度。TMS使用各种加热和冷却系统来调节电池组和车厢的温度,并通过优化其使用,降低能耗,提高车辆的整体效率。

码农17年的博客 3166

SAP 物料主数据 Forecasting 视图,别把预测只当成一个数字字段

摘要(150字): SAP S/4HANA物料主数据的Forecasting视图常被忽视,但对依赖历史消耗规律的物料至关重要。该功能基于工厂维度的历史消耗数据,结合预测参数自动计算未来需求,动态调整重订货点和安全库存。预测模板(Forecast Profile)能标准化参数设置,而消耗数据(Consumption Values)的质量直接影响预测结果。预测值作为MRP输入,需注意保存操作才能生效。自动重订货点功能通过分析消耗波动和服务水平,实现库存策略的动态优化。Individual Forecast功能则

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1437

C++学习 高级编程

C++文件和流 到目前为止,目前使用最为广泛的是iostream标准库,它提供了cin和cout方法分别用于从标准输入读取流和向标准输出写入流。 以下将介绍从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库fstream,它定义了三个新的数据类型: 数据类型 描述 ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 ifstream 该数据类型表示输入文件流,用于从文件读取信息。 fstream 该数据类型通常表示...

CHYabc123456hh的博客 638

100天精通Python(基础篇)——第3天:运算符全解析(算术运算符、比较运算符、逻辑运算符、赋值运算符及其优先级规则)

100天精通Python(基础篇)——第3天:运算符全解析(算术运算符、比较运算符、逻辑运算符、赋值运算符及其优先级规则)

努力让自己发光,对的人才能迎着光而来 14万+

VS2005中fstream不能读中文路径文件的bug

这几天一直被题目中问题缠绕着,在网上找到很多答案,实际能解决问题的答案只看到一个:在程序中加入:std::locale loc = std::locale::global(std::locale(""));//设置环境为系统环境std::fstream f("c:/文件.txt", ios::binary |  ios::in);std::locale::global( loc );/

czjjun的专栏 2194

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

fstream,FILE之间的选择

作为一个C++的拥护者,我jin

xujiezhige的专栏 9165

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

fstream中的readsome遇到的问题

今天用fstream中的readsome去读取文件到buffer中。碰到了bug.因为不知道文件的大小,担心超出buffer的容量或者不足本以为用readsome是可以实现的,不过调试发现readsome总是返回0,什么都没有读到。后来查了一下下面的资料1.由一个Bug看ifstream中read()与readsome()的区别http://www.softat.org/viewthread.

1751

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VC2005的fstream不支持中文路径BUG[转载]

VC2005的fstream不支持中文路径BUG[转载] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://haoren.blogbus.com/logs/2278697.html 前两天写的一个程序里面,发现中文路径扫描有问题,无法得出带有中文路径的文件的CRC值以及文件大小。因为这两个获得都是通过fstream实...

weixin_30552635的博客 144

fstream 和 中文路径 [转]

转载自:http://jackinelee.blog.hexun.com/20954695_d.htmlfstream 和中文路径 有时候用ifstream或ofstream打开带有中文路径的文件会失败。解决办法:1、使用C语言的函数设置为中文运行环境setlocale(LC_ALL,"Chinese-simplified");2、使用STL函数设置为系统语言环境std::lo

小浦原的技术专栏 1379

fstream eof 死循环

fstream EOF标志被置位后,需要先执行fs.clear()清除标志位,再执行seek操作,否则会导致读指针和EOF标志不同步的问题,个人感觉这种情况算是fstream对EOF标志处理的一个bug。

zhangzhiyu1985的博客 699

c语言中fstream用法,c – 在类中使用fstream getline()函数

我正在尝试将包含字典单词的文本文件的行加载到数组对象中.我想要一个数组来保存所有以“a”开头的单词,另一个单词用于“b”…用于表示字母表中的所有字母.这是我为数组对象编写的类.#include #include #include using namespace std;class ArrayObj{private:string *list;int size;public:~ArrayObj(){ ...

weixin_31597865的博客 857

让fstream支持中文路径文件打开

让fstream支持中文路径文件打开

whl0071的专栏 419

fstream 和中文路径

fstream 和中文路径  有时候用ifstream或ofstream打开带有中文路径的文件会失败。 解决办法: 1、使用C语言的函数设置为中文运行环境 setlocale(LC_ALL,"Chinese-simplified"); 2、使用STL函数设置为系统语言环境 std::locale::global(std::locale("")); 当然选2啦! 另转载针对该问题的详

落羽的专栏 4261

fstream和中文路径

  fstream和中文路径前几天用了一个开源的工具来设计界面(www.wxformbuilder.org)。结果发现有个bug,只要存储路径有中文字符,存储就会失败,而且没有任何提示。一下午的工作就白白丢失了。今天自己写程序也遇到这个情况,是fstream的问题。默认的情况下不支持中文路径。fopen就可以。查到一篇文章讲这个,一定程度上能解决问题:问题:有时候用ifstream或o

1444

报错use of deleted function ‘std::basic_fstream..的处理

bug1: 在定义print函数的时候,文件输出流没有定义成引用导致以下报错: use of deleted function ‘std::basic_fstream<_CharT, _Traits>::basic_fstream(const std::basic_fstream<_CharT, _Traits>&) [with _CharT = char; _Tr...

beidou111的博客 5303

让fstream支持中文路径

fstream 和中文路径  有时候用ifstream或ofstream打开带有中文路径的文件会失败。 解决办法: 1、使用C语言的函数设置为中文运行环境 setlocale(LC_ALL,"Chinese-simplified"); 2、使用STL函数设置为系统语言环境 std::locale::global(std::locale("")); 当然选2啦! 另转

拥抱变化 2367
上一篇: C++中的文件输入/输出(6):一些有用的函数
下一篇: Reading and Writing to Binary Files
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值