【发布时间】:2021-12-18 20:52:55
【问题描述】:
我正在尝试读取以下格式的文件
id1 1 2 3
id2 2 4 6
id3 5 6 7
...
使用此代码
Dataset::Dataset(ifstream &file) {
string token;
int i = 0;
while (!file.eof() && (file >> token)){
// read line tokens one-by-one
string ID = token;
vector<int> coords;
while ((file.peek()!='\n') && (!file.eof()) && (file >> token)) {
coords.push_back(atoi(token.c_str()));
}
points.push_back(new Point(ID, coords));
i++;
}
cout << "Loaded " << i << " points." << endl;
}
但它告诉我我读了 0 分。我做错了什么?
编辑:我使用input_stream.open(input_file) 打开它,file.good() 返回true。
编辑 #2:实际上 .good() 第一次返回 true,然后返回 false。这是怎么回事?
编辑#3:伙计们。真是太棒了。当我通过 cin 将路径设置为 Dataset/test.txt 时,它可以工作,而当我通过命令行将路径设置为 Dataset\test.txt 时,它不会...
现在的问题是它似乎并没有止步于新行!
编辑#4:又是吓人的窗户!它偷看的是 '\r' 而不是 '\n'。
【问题讨论】:
-
听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs 和 Debugging Guide
-
可能文件没有打开。也许您将数据文件放在错误的位置或错误地命名。也许该文件没有您期望的内容。调试应该对您有所帮助。在
Dataset::Dataset(ifstream &file)中设置断点并在断点被命中后一次调试代码 1 行。查看每条语句执行后的变量和流程。 -
为什么在向量中存储
Point*而不是Point? -
@Michael "我希望这些点在堆上一次,并且在通过值传递它们时不会被复制" - 为什么需要向量中的指针来避免复制?您将获得的唯一副本是矢量调整大小 - 但您几乎不会注意到这一点。
-
有vector::emplace_back