C++ fstream的奇怪问题

C++ fstream的奇怪问题,c++,fstream,C++,Fstream,我想使用fstream转到文本文件中特定行中的特定字符 例如,我想转到第2行,我这样做: stream.ignore(20, '\n'); // because i have 20 characters in each line. 它工作得很好,但当我尝试在这条线上移动时: stream.seekg(1, ios::cur); // move 1 char from the current position. 我测试了输出: char test; stream >> test;

我想使用fstream转到文本文件中特定行中的特定字符

例如,我想转到第2行,我这样做:

stream.ignore(20, '\n'); // because i have 20 characters in each line.
它工作得很好,但当我尝试在这条线上移动时:

stream.seekg(1, ios::cur); // move 1 char from the current position.
我测试了输出:

char test;
stream >> test;
它在第3行中间给我一个角色!(我应该在2号线)

然后我检查了我目前的职位是否符合以下要求:

stream.seekg(0, ios::cur);
stream >> char;
还可以,它给了我第2行开头的字符。但是正如你看到的,当我用1替换0时,它在3行中间给了我一个字符!不应该移动1个字符吗

你知道为什么会这样吗

我正在制作一个基于平铺的等轴测引擎,我需要在文本文件中保存和读取我的数据库。我正在保存/读取的地图区域需要在我的视图上,因此我必须从minx char读取到maxx char,从miny(line)char读取到maxy(line)

谢谢

试试这个:

cout<<"Now at "<<stream.tellg()<<endl;

stream.ignore(20,'\n');

cout<<"Moved to "<<stream.tellg()<<endl;

stream.seekg(1, ios::cur);

char test;
stream>>test;
cout<<"Got character "<<test<<" from position "<<stream.tellg()<<endl;
cout试试这个:

cout<<"Now at "<<stream.tellg()<<endl;

stream.ignore(20,'\n');

cout<<"Moved to "<<stream.tellg()<<endl;

stream.seekg(1, ios::cur);

char test;
stream>>test;
cout<<"Got character "<<test<<" from position "<<stream.tellg()<<endl;
cout试试这个:

cout<<"Now at "<<stream.tellg()<<endl;

stream.ignore(20,'\n');

cout<<"Moved to "<<stream.tellg()<<endl;

stream.seekg(1, ios::cur);

char test;
stream>>test;
cout<<"Got character "<<test<<" from position "<<stream.tellg()<<endl;
cout试试这个:

cout<<"Now at "<<stream.tellg()<<endl;

stream.ignore(20,'\n');

cout<<"Moved to "<<stream.tellg()<<endl;

stream.seekg(1, ios::cur);

char test;
stream>>test;
cout<<"Got character "<<test<<" from position "<<stream.tellg()<<endl;




cout此处的链接:说明必须以二进制模式打开文件,seekg才能可靠地使用offset。试试看。

此处的链接:说明必须以二进制模式打开文件,seekg才能可靠地使用偏移量运行。试试看。

此处的链接:说明必须以二进制模式打开文件,seekg才能可靠地使用偏移量运行。试试看。

此处的链接:说明必须以二进制模式打开文件,seekg才能可靠地使用偏移量运行。试试看。

你能添加文本文件或从中摘录吗?这是我用于测试的文本文件:你确定这不是签名/未签名问题吗?尝试使用无符号字符。编辑(看到你的文本文件):好的,没关系。只是用未签名的字符测试了一下,没有用。我只是测试了一下,效果很好。在移动到下一行之前,请使用stream.tellg()查看当前位置。由于您正在从ios::cur移动,如果getpointer未设置在文件的开头,则不会移动到下一行的开头。您可以添加文本文件或从中摘录吗?这是我用于测试的文本文件:您确定这不是签名/未签名问题吗?尝试使用无符号字符。编辑(看到你的文本文件):好的,没关系。只是用未签名的字符测试了一下,没有用。我只是测试了一下,效果很好。在移动到下一行之前,请使用stream.tellg()查看当前位置。由于您正在从ios::cur移动,如果getpointer未设置在文件的开头,则不会移动到下一行的开头。您可以添加文本文件或从中摘录吗?这是我用于测试的文本文件:您确定这不是签名/未签名问题吗?尝试使用无符号字符。编辑(看到你的文本文件):好的,没关系。只是用未签名的字符测试了一下,没有用。我只是测试了一下,效果很好。在移动到下一行之前,请使用stream.tellg()查看当前位置。由于您正在从ios::cur移动,如果getpointer未设置在文件的开头,则不会移动到下一行的开头。您可以添加文本文件或从中摘录吗?这是我用于测试的文本文件:您确定这不是签名/未签名问题吗?尝试使用无符号字符。编辑(看到你的文本文件):好的,没关系。只是用未签名的字符测试了一下,没有用。我只是测试了一下,效果很好。在移动到下一行之前,请使用stream.tellg()查看当前位置。由于您正在从ios::cur移动,并且如果getpointer未设置在文件的开头,则不会移动到下一行的开头。输出为:现在在0处,移动到45处,从位置72处获得字符a。我删除并再次创建了我的文件,现在我有:现在在0处,移动到39处,从一个位置59@user3134405尝试将“\n”替换为13,看看会发生什么。很抱歉:现在是0,从60移到40。用13替换“/n”后,我有,0,39,a from 59。你能发布从声明流开始的代码吗?输出是:现在在0,移动到45,从位置72获得字符a。我删除并再次创建了我的文件,现在我有:现在在0,移动到39,从位置a59@user3134405尝试将“\n”替换为13,看看会发生什么。很抱歉是:现在是0,移动到40,a从60。用13替换“/n”后,我有,0,39,a from 59。你能发布从声明流开始的代码吗?输出是:现在在0,移动到45,从位置72获得字符a。我删除并再次创建了我的文件,现在我有:现在在0,移动到39,从位置a59@user3134405尝试将“\n”替换为13,看看会发生什么。很抱歉是:现在是0,移动到40,a从60。用13替换“/n”后,我有,0,39,a from 59。你能发布从声明流开始的代码吗?输出是:现在在0,移动到45,从位置72获得字符a。我删除并再次创建了我的文件,现在我有:现在在0,移动到39,从位置a59@user3134405尝试将“\n”替换为13,看看会发生什么。很抱歉是:现在是0,移动到40,a从60。用13替换“/n”后,我有,0,39,a从59。你能发布从声明流开始的代码吗?这可能是问题所在,我仍然不明白为什么它在我的计算机上工作。以二进制格式打开文件:stream(“data.txt”,ios::binary);当我尝试使用二进制时,if(stream)条件为false,因为我的输出为空。当我不使用这个条件时,我的输出是,现在是-1,移动到-1,从-1得到u,你在使用什么操作系统和编译器?@user3134405你的输出是空的是什么意思?fstream数据(“data.txt”,ios_base::in | ios_base::binary);不适合您?fstream数据(“data.txt”,ios_base::in | ios_base::binary),我想它成功了!现在在0,移动到20,从23得到b这可能是问题,我仍然不明白为什么它在我的计算机上工作。以二进制格式打开文件:stream(“data.txt”,ios::binary);当我尝试使用bin时