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

对于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啊!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值