C++ seekp/g和tellp/g工作不正常
每当我试图在C++ seekp/g和tellp/g工作不正常,c++,io,fstream,iostream,getline,C++,Io,Fstream,Iostream,Getline,每当我试图在fstream对象上使用tellp/g和seekp/g函数,并使用fstream::getline(cstr,bufsize)函数时,它就是不能正常工作,也不能在'cstr'变量中存储任何内容。并且它不会报告任何使流无效的问题,如failbit或badbit 示例代码:它所做的是逐行读取,每次读取时跳到文件的末尾,并打印下一行从文件开头的偏移量 int main() { // Prepare file fstream f("test.txt"
fstream
对象上使用tellp/g
和seekp/g
函数,并使用fstream::getline(cstr,bufsize)
函数时,它就是不能正常工作,也不能在'cstr'变量中存储任何内容。并且它不会报告任何使流无效的问题,如failbit
或badbit
示例代码:它所做的是逐行读取,每次读取时跳到文件的末尾,并打印下一行从文件开头的偏移量
int main()
{
// Prepare file
fstream f("test.txt", fstream::ate | fstream::in | fstream::out);
// Prepare needed data for production
auto end_mark = f.tellg();
size_t count{0};
char c[64];
// Go back to the beginning
f.seekg(0, fstream::beg);
while(f && f.tellg() != end_mark && f.getline(c, 64))
{
count += f.gcount();
auto mark = f.tellg();
// Go to the end
f.seekp(0, fstream::end);
f << count; // print the next line's offset
if(mark != end_mark) f << " ";
// print results on shell ..For debug purposes
cout << c << " - " << count << endl;
// Go back to the last read point
f.seekp(mark);
}
return 1;
}
执行后的test.txt:
abcd
efg
hi
j
5 6 7 8
但人们所期望的是:
abcd
efg
hi
j
5 9 12 14
外壳的输出为:
abcd - 5
- 6
- 7
- 8
abcd - 5
efg - 9
hi - 12
j - 14
注意c变量中没有存储任何内容
但人们对壳牌的期望是:
abcd - 5
- 6
- 7
- 8
abcd - 5
efg - 9
hi - 12
j - 14
我想指出,只有tellp/g()
和seekp/g()
函数遗漏了fstream::getline()
函数。使用以下代码:
int main()
{
// Prepare file
fstream f("test.txt", fstream::in | fstream::out);
size_t count{0};
char c[64];
while(f && f.getline(c, 64))
{
count += f.gcount();
// print results on shell ..For debug purposes
cout << c << " - " << count << endl;
}
return 1;
}
有人能告诉我为什么它会这样吗?请告诉我,我正试图理解这种奇怪的行为
我正在使用GCC-6.3.0-1进行编译
如果有任何额外的细节你想让我知道
编辑:
我已经将我的编译器更新为GCC-8.2.0-3,并且正常编译并且使用-std=c++11/14/17选项,但是仍然面临相同的问题。。。
如果您有任何建议,我们将不胜感激。忘了提及,我在某个地方读到,这可能是gcc中的编译器错误。我使用的是g++6.3.0-1,这绝不是编译器错误。你想在这行做什么:
f@KorelK他正在创建一个文件索引,并将该索引放在文件的末尾。所以这行f适合我。您使用的是哪个版本的g++。更重要的是,您使用的是标准库的哪个版本?忘了提一下,我在某个地方读到它可能是gcc中的编译器错误。我使用的是g++6.3.0-1,这绝不是编译器错误。你想在这行做什么:f@KorelK他正在创建一个文件索引,并将该索引放在文件的末尾。所以这行f适合我。您使用的是哪个版本的g++。更重要的是,您使用的是标准库的哪个版本?