首次在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()
没有返回它,我想知道为什么。