- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 fstream
从文件中读取。我正在尝试的文件阅读有这样的内容:
1200
1000
980
890
760
我的代码:
#include <fstream>
#include <iostream>
using namespace std;
int main ()
{
fstream file("highscores.txt", ios::in | ios::out);
if (!file.is_open())
{
cout << "Could not open file!" << endl;
return 0;
}
int cur_score;
while (!file.eof())
{
file >> cur_score;
cout << file.tellg() << endl;
}
}
输出是:
9
14
18
22
26
为什么在第一次读取 tellg()
后返回 9,首先读取的是数字 (1200),它有 4 个位置我知道有 \r
和 \n
所以这有 6 个位置。还。如果我在文件中添加更多数字 tellg()
将第一次读取后返回一个更大的数字。
最佳答案
如果您使用文本编辑器将文件保存为 UTF8,则可能会出现 UTF8 BOM在文件的开头。这个 BOM 有 3 个字符长,所以加上 6 个字符,就是 9 个字符。
如果您想确定,请检查文件的开头,其中:
fstream file("highscores.txt", ios::in | ios::out | ios::binary);
if(file) {
char verify[16];
file.read(verify, sizeof(verify));
int rd = file.gcount();
for(int i = 0; i<rd; i++) {
cout << hex << setw(2) << (int)verify[i] << " ";
}
cout <<dec << endl;
}
编辑:
在文件上使用 MSVC2013 在 Windows 上运行,我按预期找到了 4、10、15、20、25,但我无法重现您的数字。
我现在用 mingw 做了一个测试,在这里我得到了你的数字,增加行数会增加输出的奇怪效果。
这是 MINGW 的一个 BUG 当您以文本模式阅读 Windows(CRLF 行分隔符)文件时:
如果我以 UNIX 风格保存文件(即 LF 行分隔符),我会得到相同的程序 4,9,13,17,这又是 linux 系统的预期值。
如果我以 WINDOWS 风格保存文件(即 CRLF 行分隔符),并且如果我更改代码以在 ios::binary
中打开文件,我会得到等待的 4, 10、15、20、25。
显然这是一个 old problem .
关于c++ - 从文件读取时,tellg() 的行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30546416/
ifstream::tellg() 为某个文件返回 -13。 基本上,我编写了一个分析一些源代码的实用程序;我按字母顺序打开所有文件,我从“Apple.cpp”开始,它工作得很好..但是当它到达“Co
为什么tellg()在写操作后移动,我想应该是tellp()? std::fstream fs("c:\\log.txt", std::ios::in | std::ios::out | std::i
我有一个从文件中读取行的函数。但在读取之前,它会返回要读取下一行的地址。 我的职能是: void print() { int j=0; string a,b,c
我正在用 c++98 编写一个小解析器(是的,不能使用 11)。我正在使用 std::stringstream,我通过引用传递给不同的函数,让我们称它们为子解析器。为了知道要调用哪个子解析器,我需要知
我以二进制模式打开了一个文件,进行以下操作得到了 x 的负值。我打开的文件大小约为 2.5 GB。 infile.seekg(0, ios::end); __int64 x = infile.tell
我有一个正在读取的大型二进制文件,我想将当前位置与一个 unsigned long long int 进行比较。但是,根据 C++ 文档,我不清楚是否: tellg() 的返回类型是什么 如何比较 t
我做了一个示例项目来将文件读入缓冲区。当我使用 tellg() 函数时,它给我的值比read 函数实际上是从文件中读取的。我认为有一个错误。 这是我的代码: 编辑: void read_file (c
所以,我很好奇,因为我一直在使用这种相当有用的方法来获取文件的大小,但有些事情困扰着我。将流锁定到文件系统上的文件和 fileStream.seekg(0, std::ios::beg); int b
我下载了一个 C++ 实用程序,但在读取输入文件时由于错误而死掉了。不幸的是,它输出的只是“偏移量错误:文件中的 69570744324”;通过查看它的源代码,我发现它实际上是在那里打印出 .tell
我遇到了一个奇怪的问题。假设我正在读取这样的文件: std::ifstream in("file.txt", std::ios::binary); std::string text; in.seekg
我一直在 Visual Studio 2015 中使用 iostream 进行一些基本的文件操作,并注意到这种奇怪的行为。 #include #include #include void mai
假设我想获得两个 tellp() 输出之间的差异(整数)。 如果写入一个大文件,tellp() 的输出可能会很大,所以将它存储在一个 long long 中是不安全的。有没有安全的方法来执行这样的操作
我知道这个标题听起来很疯狂,但我现在正在亲 body 验这一点,我想不出任何失败的原因。 我正在使用 getline() 读取文件 在阅读结束时,我调用了 tellg()。但是,此调用总是失败(返回值
读取.cpp #include #include using namespace std; int main(void) { int id; char name[50];
我正在尝试使用 fstream 从文件中读取。我正在尝试的文件阅读有这样的内容: 1200 1000 980 890 760 我的代码: #include #include using names
我正在读取 data.txt: ////////////////////////////////////////////////// data.txt: ///////////////////////
我有一个 std::fstream,我使用它导入 std::fstream myFile { "C:/path/to/file.txt" }; 当我想读取第一个字节时,我使用 char c; cout
与 fstream file("test.txt",ios_base::in | ios_base::out | ios_base::binary); tellp 和 tellg 对于 file 是否
我在 std::fstream 类的 tellg() 函数中遇到问题。通常它应该返回当前字符在输入流中的位置。但是,它对我来说很奇怪。下面是一些简短的示例代码: #include #include
我正在编写一个 C++ 控制台应用程序。在用 size(int) rowSize 和 columnSize 创建了一个 Matrix 之后,我想将文本文件中的字母写入矩阵,但是 while 循环永远不
我是一名优秀的程序员,十分优秀!