我需要从外部文件中读取数字并将它们存储在整数向量中。多亏了 Howard Hinnant 和 wilhelmtell,我现在可以做到这一点,他们耐心地帮助找出了为什么我的编码昨天没有工作。
我一直在试图弄清楚如何将附加功能合并到代码中,但我已经用尽了我对流的了解,希望得到一些建议。
我希望能够处理包含多组数据的文件。是否可以仅将文件中的某些数据提取到向量中?我想最终得到几个包含来自文件不同部分的数据的向量。我在网上搜索,但没有看到任何提及这个。
这是我要从中获取数据的代码以及一个文件示例(我们称之为“测试”)。
编辑: 我根据 CashCow 的建议编辑了代码。我现在可以从数据文件中获取一个块。但我不知道如何获得我想要的块。如果我按原样运行代码,我会得到一个包含元素 2、5、8 的向量(这不是我想要的)。为了获得vectorTwo(在我制作的示例中为4,5,6),我尝试在while语句周围添加它:
if( line == "vectorTwo" )
{
// The while statement and its contents
}
它不起作用。我没有从运行代码中得到任何结果(虽然它已编译)。任何人都可以看到问题是什么?我想我可以使用这个语句来搜索我需要的数据块的标题。
//这里是示例文件的内容
vectorOne // 一个向量的数据子集标识符
'1' '2' '3'
vectorTwo // 我如何得到这个向量?还是其他任何一种载体?
'4' '5' '6'
vectorThree // 另一个向量的数据子集的标识符
'7' '8' '9'
// 代码:'\'' 字符是行分隔符。直到第一个 ' 之前的所有内容都被忽略,然后直到下一个 ' 之前的所有内容都是数字的一部分。这一直持续到逻辑失败(文件结束)。我怎样才能让它停在数据块的末尾呢?
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
int main()
{
std::string line;
std::string block; // Edited, from CashCow
const std::string fileName = "test.dat";
std::ifstream theStream( fileName.c_str() );
if( ! theStream )
std::cerr << "Error opening file test.dat\n";
std::vector<int> numbers; // This code is written for one vector only. There would be three vectors for the example file I provided above; one for the vectorOne data in the file, and so on.
while (true)
{
// get first '
std::getline(theStream, line, '\'');
// read until second '
std::getline(theStream, line, '\'');
std::istringstream myStream( line );
std::getline( theStream, block, '\n' ); // Edited, from CashCow
std::istringstream blockstream( block ); // Edited, from CashCow
std::getline(blockstream, line, '\''); // Edited, from CashCow
int i;
myStream >> i;
if (myStream.fail())
break;
numbers.push_back(i);
}
std::copy(numbers.begin(), numbers.end(),
std::ostream_iterator<int>(std::cout, "\n"));
}