seekg()没有得到在Windows上由tellg()返回的正确位置,但在使用xcode的macOS上工作正常

时间:2018-03-20 06:32:05

标签: c++ file ifstream

首次在stackoverflow上发帖。

我正在使用文件流来保存和读取一组神经网络的参数。在文件中,每行的开头都有一个标志,后跟一些值。一个更简单的例子就是:

NeuroNum 1 2 1
Weight 0.1 0.1 0.1 0.1
AnotherFlag ...
...
Break
NeuroNum 1 2 1
Weight 0.2 0.2 0.2 0.2
AnotherFlag ...
...
Break
...

Break标志表示一个网络的结束,下一行是另一个网络的参数。

我定义了一个向量networks并使用以下代码来设置参数

std::ifstream networkFile;
std::streampos pos;
...
pos = networkFile.tellg();
...
for (auto i = 0; i < num; ++i) {
    networks.emplace_back(Network());
    if (!networks[i].ReadNetwork(pos))
        return false;
}

ReadNetwork()函数定义如下。每次调用它时,它都使用seekg(pos)来定位指针位置。当它读取Break标志时,它使用tellg()来存储指针,该指针将用于ReadNetwork(pos)的下一次调用。因此,通过for循环,可以设置所有网络的参数。

bool Network::ReadNetwork(std::streampos &pos) {
    std::ifstream networkFile;
    networkFile.open(NETWORK_FILE);
    std::string flag;
    if (networkFile.is_open()) {
        networkFile.seekg(pos);
        while (networkFile >> flag) {
            if (flag == "NeuroNum") {
                // do something
            }
            else if (flag == "Weight") {
                // do something
            }
            else if (flag == "AnotherFlag") {
                // do something
            }
            else if (flag == "Break") {
                pos = networkFile.tellg();
                break;
            }
            else { 
                std::cout << "File type error!\n";
                return false;
            }
        }
        networkFile.close();
        return true;
    }
    ...
}

我首先使用xcode测试代码并且工作正常。但是当在Windows上运行代码时(IDE是代码框,编译器mingw32-g ++),我无法获得预期的位置。它会返回

File type error!

我不确定是不是因为seekg()没有找到正确的位置或tellg()没有返回它,我想知道为什么。

0 个答案:

没有答案