C/C++文件指针的区别:读取同一个文件结果诡异

多次打开同一文件与O_APPEND 1、重复打开同一文件读取(1)一个进程中两次打开同一个文件,然后分别读取,看结果会怎么样(2)结果无非2种情况:一种是fd1和fd2分别读,第二种是接续读。经过实验验证,证明了结果是fd1和fd2分别读。(3)分别读说明:我们使用open两次打开同一个文件时,fd1和fd2所对应的文件指针是不同的2个独立的指针。文件指针是包含在动态文件的文件管理表中的,所以可以看出linux系统的进程中不同fd对... 阅读详情

对于C/C++的文件操作,就是对指向FILE的指针©或者对fstream对象进行操作,此时有一个”文件位置指针“至关重要,这个是指示下一次读写操作所在字节的整数值。每次读写一个(或者1组)数据后,系统自动将文件位置指针移动到下一个读写位置上。
其实我是在用C++写一个简单的词法分析程序时候遇到的问题,废话少说,我们直接进入正题~~(也就是我遇到的问题【捂脸】)
在C++中对一个文本完全读写,分别打印读写前和读写后的文件位置指针(fstream流可以用tellg()函数来查看),我的代码如下:

# include <iostream>
# include <fstream>
using namespace std;
int main()
{
	char c;
	fstream f;
	f.open("test.txt",ios::in);
	if(!f) {
		cout << "Open file failed!";
		exit(1);
	}
	while(!f.eof()) {
		cout << f.tellg()<<' ';
		f.get(c);
		cout<< c<<' '<<f.tellg()<<endl;
	}
	f.close();
	return 0;
}

其中txt文件和源程序在相同文件夹中,截图如下(运行结果+TXT文件内容:文件以换行符结尾):
在两个疑惑点:
1.为啥那个文件位置指针从0直接跳到了2;
2.为啥最后一个字符’\n’打印了两遍
在两个疑惑点:1.为啥那个文件位置指针从0直接跳到了2;2.为啥最后一个字符'\n'打印了两遍
最后我把TXT文件最后一个换行符去掉,文件内容就是void Merge(),打印就正常了,如下
跳变问题解决了,但是最后依然把最后一个字符’)'打了两遍
最后依然把最后一个字符')'打了两遍
最后我想了一下原因可能是:最后那个文件指针到了尽头12的位置,就没法再移动了,所以就读取了’)’;
但是还有一个问题硬是不明白,我最后没办法了就用c相同的思路写了一下,代码如下:

# include <stdio.h>
int main()
{
	char c;
	FILE *f;
	if((f=fopen("test.txt","r"))!=NULL)
	{
		while(!feof(f)) {
			printf("%d ",ftell(f));
			c = fgetc(f);
			printf("%c %d\n",c,ftell(f));
		}
	}
 fclose(f);
 return 0;
}

运行结果:果然和C++不一样,没有从0直接跳到2,还有最后一个字符也就是换行符没有打印两遍,最后打印了一个空格
注意txt文件内容是以换行符结尾
注意txt文件内容是以换行符结尾
最后我也运行了上面C++的第二个例子,结果也不一样
注意这个txt文件结尾符是’)'
注意这个txt文件结尾符是')'
最后可以清楚的看到区别,最后字符没有打印两遍,无论是哪一种情况,都没有出现像c++一样的从0到2的跳变

以上就是我发现的问题,可能自己没有太弄懂,希望大佬们如果看到可以帮忙指出一下,在下感激不尽。(但是最后我还是用了c的文件操作来解决我的问题,因为C++那个跳变很让人无解,我还是相信c啊!!!

深入解析C/C++中的%x与%p:指针输出背后的位数陷阱 本文深入解析了C/C++中%x与%p格式占位符在输出指针地址时的核心区别与潜在陷阱。重点揭示了在64位系统中,误用%x输出指针会导致高32位地址被截断,造成调试困惑。文章通过对比分析,强调了使用专为指针设计的%p占位符的重要性,并提供了跨平台安全输出指针地址的最佳实践与代码规范。 阅读详情

相关推荐

C/C++指针深度解析:从内存模型到智能指针的避坑指南

指针是C/C++编程中的核心概念,它本质上是一个存储内存地址的变量,允许程序直接操作内存。理解指针的工作原理,关键在于掌握程序运行时的内存布局,包括栈区、堆区、全局/静态区等不同分区及其生命周期特性。指针的正确使用能带来极高的执行效率和灵活性,但若管理不当,则极易引发内存泄漏、悬空指针、段错误等严重问题,影响程序稳定性与安全性。在实际开发中,指针广泛应用于动态内存分配、数据结构实现、函数回调等场景。随着C++标准演进,智能指针(如unique_ptr、shared_ptr)等RAII机制已成为管理动态内存、

weixin_34121282的博客 482

2.2.1 进程管理,以及父子进程共享同一个文件资源时,文件的‘读写位置’会相互影响

目录 等待一个进程(父进程等待子进程终止) 僵尸进程(defunct / zombie) 1. 等待一个进程 当用 fork 函数调用启动一个子进程时,子进程就有了它自己的生命周期并将独立运行。可以通过在父进程中调用 wait 函数让父进程等待子进程结束。 wait 函数 #include <sys/types.h> #include <sys/wait.h>...

在巴黎铁塔 :-) 1178

C++文件操作全解析:从fstream基础到高效读取实战

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

weixin_34160277的博客 590

C++文件操作-两个程序同时分别操作一个文件的读和写

两个程序同时操作一个文件的读和写。一个程序持续写入数据到文件中,另一个程序持续的读文件。处理过程中不能判断文件是否完整,即读文件操作可能需要等待写文件操作。 处理过程中,按行读取,计算每一行的偏移量。读取一行时,设置偏移量,在读取。 读文件操作执行到文件末尾时,关闭文件,然后重新打开文件,判断文件流状态是否可用。 当文件有60秒时长没有写入文件时,就退出读写操作。 ifstream m_ifHandler; string m_runFilePath; int

zhuzitop的博客 3830

C++中string::c_str()的只读陷阱与安全使用指南

在C++编程中,字符串处理是基础且频繁的操作。std::string作为标准库提供的字符串类,其c_str()方法返回一个指向内部数据的const char*指针,这一设计遵循了C++的内存安全原则和const正确性。从技术原理看,c_str()提供的是对字符串内部缓冲区的只读视图,直接修改其返回指针会破坏与编译器的内存访问契约,触发未定义行为,在操作系统层面通常表现为段错误(Segmentation Fault),导致程序崩溃。这种机制虽然保证了与C语言接口交互时的零拷贝高效性,但也带来了常见的编程陷阱。

weixin_30387423的博客 876

C/C++未初始化变量:从内存原理到工程实践的全面解析

在编程语言中,变量初始化是确保程序行为确定性的基础概念。其原理源于计算机内存管理机制,变量定义时分配的内存区域可能包含残留的随机数据。未初始化变量的技术价值在于理解程序性能与安全性的权衡,自动变量不自动初始化是为了避免不必要的性能开销,但这要求开发者具备严谨的内存管理意识。应用场景广泛存在于系统编程、嵌入式开发和高性能计算中,任何直接使用未初始化值的操作都会导致未定义行为,可能引发程序崩溃、逻辑错误或安全漏洞。本文聚焦C/C++语言,深入剖析不同存储类别变量的初始化行为差异,特别是栈变量这一风险重灾区,并探

weixin_29306571的博客 211

4.1文件系统基础

脑图 一些概念和错题知识点整理 文件的逻辑结构是从用户观点出发看到的文件的组织形式 UNIX采用文件名和文件描述信息分开的方法,文件描述信息单独形成一个称为索引节点的数据结构 硬链接和软链接每增加一个链接就会增加一个文件名,在遍历整个文件系统的时候会多次遍历到同一个文件 硬链接比软链接快 从用户的角度看,操作系统引入文件系统的目的是实现对文件的按名存取 UNIX操作系统中,输入输出设备视为特殊文件` 文件的逻辑结构是方便用户设计的 建立软链接时,复制引用计数器 不同进程只维护自己的用户文件打开表 不同用

FuckerGod的博客 416

Code::Blocks新手必看:C/C++编译报错与警告全解析及实战解决指南

在C/C++编程学习中,编译报错与警告是每位开发者必经的调试环节。编译器作为代码的‘语法检查器’,其报错信息本质上是代码不符合语言规范或存在潜在风险的提示。理解报错原理,是提升独立调试能力、编写健壮程序的基础技术能力。从语法错误、语义错误到链接错误,不同类型的报错对应着代码结构、项目配置或构建流程中的特定问题。例如,常见的‘undefined reference’属于链接阶段错误,而‘expected ‘;’ before’则是典型的语法错误。处理这些错误不仅能解决当前程序无法运行的问题,更能深化对程序编译

weixin_33725270的博客 429

C++中不同指针指向同一个字符串,然而地址相同

int main(int argc, char* argv[]) { char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char * str5 = "abc"; const char * str

qq_26460507的博客 1995

VC++ 2010:C/C++入门环境搭建与核心调试实战指南

C/C++作为系统级编程语言,其核心在于对内存管理、数据类型和编译原理的深入理解。学习编程的第一步往往是环境配置,一个稳定、简洁的开发环境能帮助初学者聚焦语言本质,避免被复杂的工具链分散注意力。Visual C++ 2010 Express学习版正是这样一个经典选择,它提供了纯粹的C/C++开发体验,特别适合国内教育体系和自学者。通过搭建环境、编写第一个程序、掌握调试技巧,学习者可以深入理解从源代码到可执行文件的完整流程。本文以VC++ 2010为例,详细演示了如何配置开发环境、编写Hello World程

weixin_30471561的博客 382

电子数据取证实战:从“平航杯”竞赛看计算机检材分析的关键技术与案例解析

本文通过'平航杯'电子数据取证竞赛案例,深入解析计算机检材分析的关键技术,包括USB设备追踪、浏览器历史分析、AI换脸取证、虚拟货币交易追踪等实战技巧。重点探讨了数字痕迹的发现与关联,以及电子取证工具链的应用,为从业人员提供实用的技术参考和案例分析。

www00的博客 537

深入解析C/C++多级指针:从内存模型到动态二维数组实战

指针是C/C++编程中直接操作内存的核心机制,它通过存储变量地址实现了高效的数据共享与传递。其原理在于利用内存地址的间接访问,解引用操作符(*)用于获取或修改目标数据。这一技术价值在于避免了不必要的数据拷贝,显著提升了程序性能,尤其在系统编程和底层优化中至关重要。应用场景广泛,包括动态内存管理、函数间参数传递以及复杂数据结构(如链表、树)的实现。本文聚焦于多级指针这一高级主题,通过剖析**动态创建二维数组**和**在函数中修改指针本身**等典型应用,结合内存模型图解与常见错误排查,帮助开发者掌握其正确用法与

weixin_34082789的博客 378

机器学习: 共轭梯度算法(PCG)

今天介绍数值计算和优化方法中非常有效的一种数值解法,共轭梯度法。我们知道,在解大型线性方程组的时候,很少会有一步到位的精确解析解,一般都需要通过迭代来进行逼近,而 PCG 就是这样一种迭代逼近算法。 我们先从一种特殊的线性方程组的定义开始,比如我们需要解如下的线性方程组: Ax=bAx=b 这里的 A(n×n)A(n×n) 是对称,正定矩阵, b(n×...

weixin_30807677的博客 3181

C/C++内存分配:malloc与new的核心区别与实战选用指南

内存管理是编程中的基础概念,它决定了程序如何高效、安全地使用系统资源。其核心原理在于程序运行时向操作系统动态申请和释放内存空间,以满足数据结构与对象的存储需求。这一机制的技术价值在于,它使程序能够灵活处理未知或变化的数据规模,是构建复杂软件系统的基石,广泛应用于操作系统、游戏引擎、数据库及高性能计算等场景。在C/C++领域,内存分配主要通过malloc/free和new/delete两套机制实现,它们分别代表了C语言的原始内存操作与C++面向对象的一站式服务。理解其底层差异,对于避免内存泄漏、野指针等关键问

weixin_30696427的博客 345

MT6816磁编码器在无人机电调中的实战应用:从选型到调试全记录

本文详细介绍了MT6816磁编码器在无人机电调系统中的实战应用,涵盖选型、硬件集成、软件配置到飞行测试的全流程。通过对比霍尔传感器和光电编码器,突出MT6816在角度分辨率、安装公差和抗振动能力等方面的优势,为无人机动力系统提供高精度控制解决方案。

pandas7gardener的博客 234

实战派指南:反激电源EMI滤波器设计,从理论计算到PCB布局避坑

本文详细解析了反激式开关电源EMI滤波器设计的全流程,从理论计算到PCB布局避坑,结合34W PD快充电源案例,系统介绍了共模与差模干扰的识别、关键元件选型、参数计算优化及PCB布局技巧,帮助工程师有效解决传导测试超标等常见问题。

weixin_29230805的博客 373

C++ && C 学习八:C++不回避问题,它只是把问题留给使用者

1、

qfturauyls的博客 524

车辆横向控制MPC实战:从‘老王模型’到CasADi求解的保姆级避坑指南

本文详细解析了车辆横向控制MPC的实战应用,从经典动力学模型选择到CasADi求解器的优化配置,提供了一套完整的避坑指南。重点介绍了车辆动力学模型的验证要点、CasADi环境的高效配置技巧以及MPC问题建模的核心要素,帮助开发者快速实现稳健的横向控制方案。

weixin_42524499的博客 346

C++中sizeof、strlen、length与size函数的本质区别与实战应用

在C++编程中,理解数据的内存布局与运行时内容是关键基础。编译时运算符sizeof用于获取类型或对象的内存字节数,它基于类型信息在编译期完成计算,常用于内存分配、结构体对齐及静态数组元素计数。运行时函数strlen则遍历C风格字符串直到空字符,返回字符长度,其O(n)复杂度在长字符串处理中可能成为性能瓶颈,且对缓冲区安全至关重要。现代C++的std::string通过封装提供了length()和size()成员函数,两者功能完全一致,均以O(1)复杂度返回字符数,并与STL容器接口统一,提升了安全性与泛型编

weixin_30267785的博客 652

4、硬件工程师笔试面试知识器件篇——电阻(2025版本)

本文系统介绍了电阻的基础知识与应用。首先阐述了电阻的定义、工作原理及类型(固定/可变电阻),详细说明了常见电阻材料(碳膜、金属膜、线绕等)的特性与标记方法。重点分析了电阻在电路设计中的关键参数:功率计算需考虑1.5-2倍安全裕度,温度系数影响电路稳定性。文章还对比了不同封装形式(轴向/贴片/功率封装等)的适用场景,特别强调高功率电路需选择专用封装并做好散热设计。最后指出电路仿真可优化电阻选择,并列举了相关电子元件在设计中同样需要仿真验证。全文为硬件工程师提供了电阻选型的实用指导。

XU157303764的博客 5211

【OpenClaw企业级智能体实战】第24篇:一人公司实战——用Agent Teams同时管理产品、运营、销售(附16个Agent配置方案+全流程指令模板)

当AI智能体从“单一工具”进化为“协同团队”,“一人公司”已从商业概念变为落地现实。2025年中国超1200万个体创业者采用OPC模式,靠AI团队突破人力边界。本文基于OpenClaw Agent Teams框架,拆解“1总指挥+15执行者”的三层AI组织架构,提供覆盖产品、运营、销售全业务的16个Agent分工矩阵、可直接复制的部署代码、通信配置方案与全流程指令模板。通过虚拟案例验证:单人+AI团队可实现月入26万的商业闭环,AI承担90%标准化工作,人力成本降低75000元/月,ROI超3200%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 944

C/C++结构体从入门到精通:定义、内存对齐与实战应用

在C/C++编程中,自定义数据类型是构建复杂数据模型的核心基础。结构体(struct)作为一种用户自定义的复合数据类型,其原理在于将多个不同类型的变量组合成一个单一的逻辑单元,从而增强数据的组织性和代码的可读性。这一技术价值在于它能将现实世界的实体(如学生、坐标点)映射为程序中的数据结构,解决了使用多个独立变量管理相关数据时逻辑关联弱、管理繁琐的问题。在应用场景上,结构体广泛应用于数据记录管理、图形学坐标表示、链表与树等数据结构节点定义,以及嵌入式开发中的硬件寄存器映射。本文聚焦于结构体的核心用法,深入探讨

weixin_33911824的博客 414

【Network Management】AUTOSAR局部网络管理从0到1配置实践

AUTOSAR局部网络管理从0到1配置实践

qq_36056498的博客 2915

C++引用与指针深度解析:从底层原理到实战场景选择

在C++编程中,理解变量访问机制是掌握内存管理和高效编程的基础。引用作为对象的别名,提供了安全、直观的访问方式,而指针作为存储地址的变量,则赋予了程序员直接操作内存的灵活性。从原理上看,引用在语义上强调“终身绑定”,编译器可据此优化;指针则需处理地址运算与空值风险,两者在底层实现虽有相似,但类型系统和编译器优化策略截然不同。其技术价值在于,合理选择能显著提升代码安全性、可读性与性能。在函数参数传递、容器操作、多态实现等常见应用场景中,引用适用于明确修改对象且无需空值的场合,而指针则更擅长表达可选性、动态内存

weixin_31528001的博客 254

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C/C++文件读写核心技术:从文本到二进制,从基础到实战

文件读写是数据持久化的核心技术,它实现了内存中瞬时数据与磁盘等持久化存储介质之间的桥梁。其核心原理在于通过操作系统提供的接口,对存储介质上的字节序列进行精确的读写控制。这项技术的价值在于,它是构建任何可靠软件系统的底层能力,无论是应用程序的配置加载、用户数据保存,还是大型系统的日志处理与数据交换,都离不开高效稳健的文件操作。在应用场景上,主要分为文本模式与二进制模式:文本模式处理人类可读的字符序列,涉及编码转换;而二进制模式则直接操作内存数据的字节镜像,用于保存程序状态、多媒体数据等,需要特别注意**内存对

weixin_33895657的博客 372

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++入门必知:指针引用、const、内存管理与STL核心细节解析

在C++编程中,理解基础概念和底层原理是写出健壮代码的关键。从计算机内存管理的基本原理出发,程序运行时数据存储在栈或堆中,栈内存自动管理而堆内存需手动分配释放,这直接关系到程序的性能和安全性。C++通过RAII(资源获取即初始化)技术,将资源生命周期与对象绑定,利用智能指针自动管理内存,有效防止内存泄漏,体现了其系统级编程的价值。在实际开发中,掌握指针与引用的本质区别、const关键字的多种用法、以及STL容器如vector和string的正确使用,能帮助开发者避免常见陷阱,提升代码质量。这些核心知识点正是

weixin_33937499的博客 692

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 【成功解决】运行qt生成的.exe文件报“无法找到入口”的问题
下一篇: 【多边形法】解决循环赛问题(n分为奇数和偶数)
一荤配一素
博客等级 码龄8年 189粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值