获取行末结束符?

3
我有一个包含n列和y行二进制值的文本文件。
我正在使用getline提取每一行的二进制值,并将它们分配到向量中:
我正在使用getline提取文件的每一行,其中每一行由一系列用空格分隔的“0”或“1”组成,并将它们分配到向量中。
std::vector< std::vector<int> > matrix; // to hold everything.
std::string line;
while(std::getline(file,line))
{
  std::stringstream linestream(line);
  int  a,b,c,d;
  linestream >> a >> sep >> b >> sep >> c >> sep >> d;
  std::vector <int> vi;
  vi.push_back(a);
  vi.push_back(b);
  vi.push_back(c);
  vi.push_back(d);
  matrix.push_back(vi);
}

现在的问题是我不知道文件中有多少列。如何循环遍历每一行直到到达该行的末尾?


2
getline() 函数不能用于二进制文件。getline() 和 operator>> 运算符是为文本文件设计的(这些文件可能是人类可读的)。二进制文件将包含任意数据,这些运算符会被混淆。 - Martin York
@Martin:我指的是一个用空格分隔的0和1组成的表格。 - alandalusi
请在您的问题中明确说明。 - Lightness Races in Orbit
3个回答

3
明显的方法可能是这样的:

while (linestream >> temp >> sep) 
    vi.push_back(temp);

虽然这种方法可能会在最后一个项目失败,因为它可能没有跟随分隔符。你有几个选择来正确处理它。一个是典型的“循环半”习语。另一个是使用本地化,将您的分隔符字符视为空格。
当您这样做时,还可以使用标准算法:
std::copy(std::istream_iterator<int>(linestream),
          std::istream_iterator<int>(),
          std::back_inserter(vi));

3
通过分离读取操作来修复它:while (linestream >> temp) { vi.push_back(temp); linestream >> sep; } - Josh
1
@user349433:这当然也是可能的,但我更喜欢将其分隔符解释为空格。 - Jerry Coffin
之前不知道什么是“半个循环”的编程习语,现在找到了一个链接:loop and a half - Christian Ammer
我在这里寻求麻烦,但如果分隔符不止一个字符怎么办?理想情况下,也是最有可能的,组成分隔符的字符不是数字,因此在这种情况下不适用。但是,我很好奇如何根据语言环境实现多字符分隔符。 - rcollyer
@rcollyer:那要看情况。将一系列字符全部视为空格很容易。但如果你需要按正确顺序验证特定的字符串,这种方法就不适用了(这时可以考虑使用TR1/Boost正则表达式)。 - Jerry Coffin

0
为什么不使用以下代码而无需使用分隔符呢? ``` while (in1 >> i) row.push_back(i); ```

对不起,我看到它可能是逗号分隔的等等。 - John

-1

检查是否存在换行符(\n)。当发现一个时,即完成了这一行/列。


你的评论也不是很有帮助。你能否解释一下为什么它没有帮助,而不是让我感到困惑呢? - MGZero
他已经在逐行阅读了。因此搜索换行符没有任何作用。实际上,甚至不会有一个。他遇到的问题是迭代列并不知道运行“检查”的次数;建议进行新的“检查”与解决所述问题无关。 - Lightness Races in Orbit
我明白了,那我误解了OP的问题。 - MGZero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接