对于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’打印了两遍
最后我把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文件内容是以换行符结尾
最后我也运行了上面C++的第二个例子,结果也不一样
注意这个txt文件结尾符是’)'
最后可以清楚的看到区别,最后字符没有打印两遍,无论是哪一种情况,都没有出现像c++一样的从0到2的跳变
以上就是我发现的问题,可能自己没有太弄懂,希望大佬们如果看到可以帮忙指出一下,在下感激不尽。(但是最后我还是用了c的文件操作来解决我的问题,因为C++那个跳变很让人无解,我还是相信c啊!!!