Ostream Tellp在Windows上失败,但在Linux上没有失败

Ostream tellp fails on Windows but not on Linux

本文关键字:失败 Linux 但在 Windows Tellp Ostream      更新时间:2023-10-16

我正在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,然后将其转换为uint64Before FailBad 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