Ostream Tellp在Windows上失败,但在Linux上没有失败
Ostream tellp fails on Windows but not on Linux
我正在Windows 10中执行相同的代码,并在Linux中使用QT 5.7执行相同的代码,并且仅在Linux中起作用。我正在尝试确定刚刚创建的 ostream iostream的大小,因此应该是空的。在linux size()中返回0,但是在Windows中它返回-1,因为Tellp()失败。
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <memory>
#include <sstream>
class Foo {
private:
std::shared_ptr<std::ostream> myOstream;
std::shared_ptr<std::istream> myIstream;
public:
Foo::Foo(std::shared_ptr<std::iostream> myIostream)
: myIstream(std::static_pointer_cast<std::istream>(myIostream))
, myOstream(std::static_pointer_cast<std::ostream>(myIostream))
{}
uint64_t Foo::Size() {
int ret = 0;
std::cout << "Before – Fail Flag: " << myOstream->fail() << ", Bad Bit: " << myOstream->bad() << std::endl;
if (myIstream.get() != nullptr) {
myIstream->clear();
auto oldPos = myIstream->tellg(); //returns 0
myIstream->seekg(0, std::ios_base::end);
ret = static_cast<int>(myIstream->tellg()); //returns 0
myIstream->seekg(oldPos);
}
if (myOstream.get() != nullptr) {
auto oldPos = myOstream->tellp(); //returns -1
myOstream->seekp(0, std::ios_base::end);
ret = static_cast<int>(myOstream->tellp()); //returns -1
myOstream->seekp(oldPos);
}
//Fail Flag returns -1, Bad Bit Flag returns 0
std::cout << "After – Fail Flag: " << myOstream->fail() << ", Bad Bit: " << myOstream->bad() << std::endl;
return static_cast<uint64_t>(ret);
}
};
int main()
{
auto myStringStream = std::make_shared<std::stringstream>(
std::ios::in | std::ios::out | std::ios::binary);
Foo foo(std::static_pointer_cast<std::iostream>(myStringStream));
std::cout << "Size: " << foo.Size() << std::endl;
system("pause");
return 0;
}
我将18446744073709551615
作为大小,因为它返回-1,然后将其转换为uint64
。Before Fail
和Bad flag
都返回0。After Fail
标志返回1,Bad flag
返回0。
我读到这是因为哨兵的构建失败了,但我不知道该怎么办。
编辑:
在使用代码之后,我意识到我缺少代码的一部分。我了解的是,要使代码数字算出已经读取了多少码,请调整指针到该位置,然后计算剩余多少并返回该值。但是,由于iostream是新的,并且被施放。Get()返回内存位置并通过IF语句。然后,iStream部分将指针更改为末端,这就是为什么Ostream部分失败的原因。这是正确的吗?
编辑2:找到了解决方案。问题在于myistream-> seekg(oldpos),但是由于myistream和myostream之间共享状态,直到Ostream呼叫才会捕获错误。弦缓冲区懒散地分配,但Seekp()不适合这一点。解决此问题的工作是用垃圾数据填充Stringstream,或者更好地检查它是否在使用之前是空的。
找到了解决方案。问题在于myistream-> seekg(oldpos),但是由于myistream和myostream之间共享状态,直到Ostream呼叫才会捕获错误。弦缓冲区懒散地分配,但Seekp()不适合这一点。解决此问题的工作是用垃圾数据填充Stringstream,或者更好地检查它是否在使用之前是空的。 - Namox9001
- 使用 execv 从C++代码执行的 Linux 脚本失败
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- 构建 C++ Allegro 5 在 Linux Mint QT 上失败
- 从 Linux OMI (omicli) 到 Windows WMI 的连接失败,并出现与 DMTF 相关的错误
- Opendir() 在带有空格的名称上失败,在 Linux 上运行
- 使用 boost::序列化序列化 std::vector of unique_ptr 在 Linux 上失败
- C++在Linux机器上使用cmake Qt5 Webkit进行交叉编译,使用mingw针对Windows,失败了
- QtWebEngine 到嵌入式 Linux 交叉编译失败
- 在 Linux 上,JNI AttachNativeThread 总是失败,返回值为 -1
- Linux c++:getaddrinfo 因 EAI_AGAIN 而失败,curl 无法解析主机
- 在Linux Mint上编译Qt-OpenGL功能测试失败
- C++/LapackE 代码在 Windows 上编译良好,但相同的代码在 Linux 上编译失败
- Ostream Tellp在Windows上失败,但在Linux上没有失败
- Linux Flex gcc 编译失败,并显示"未定义对 'TclReError'的引用"
- 在linux上链接clang/llvm库总是失败
- gsoap-linux c++/结构失败传递
- 代码编译在Linux上失败,在Windows上成功:原因/修复
- 在C++std::streams中,失败后,如何获得失败原因?必需:线程安全,适用于Windows和Linux(或至少M
- BLAS 替换会导致 Linux 中的矩阵乘法失败,但在 Windows 中则不然