无法显示第一列

时间:2017-04-19 17:18:23

标签: c++

您好我只是从文件中获取一些数据,但这很奇怪,因为我无法获取文本文件的第一列。这是我的文本文件:

1.2 2.6 3.5
1.02 3.05 4.65
7.15 0.54 9.26 

这是我的代码:

#include <iostream>
#include <fstream>

int main() {
  std::ifstream myFile("a.txt");
  std::string line;

  while(std::getline(myFile, line)) {
    std::string col1, col2, col3;
    myFile >> col1, col2 >> col3;
    std::cout << col1 << " " << col2 << " " << col3 << std::endl;
  }

  return EXIT_SUCCESS;
}

所以我不明白为什么在执行程序时我无法在终端中看到:

1.2 2.6 3.5
1.02 3.05 4.65
7.15 0.54 9.26 

相反,我看到了这一点:

1.02 3.05 4.65
7.15 0.54 9.26 

非常感谢你!

2 个答案:

答案 0 :(得分:0)

我建议使用operator>>输入您的数据:

double col1, col2, col3;
char comma;
while (myFile >> col1)
{
  myFile >> comma;
  myFile >> col2 >> comma;
  myFile >> col3;
  //...
}

更好的方法是使用结构对输入行进行建模:

struct Record
{
  double value1;
  double value2;
  double value3;
  friend std::istream& operator>>(std::istream& input, Record& r);
};

std::istream& operator>>(std::istream& input, Record& r)
{
  char comma;
  input >> r.value1 >> comma;
  input >> r.value2 >> comma;
  input >> r.value3;
  return input;
}

上面的代码允许您读取如下文件:

std::vector<Record> database;
Record r;
while (myFile >> r)
{
  database.push_back(r);
}

要在文件中读取的代码片段不依赖于数据的格式,可用于读取其他格式。结构Record确定数据的输入方式。

答案 1 :(得分:0)

Getline()和&gt;&gt;

问题是您使用getline()检查输入,然后尝试使用>>从您的信息流中读取。这不符合预期。

想象一下你的流中有某种光标。有std::fstream的成员函数可以移动这个光标,有些则没有。

使用getline()向前移动此光标。当您使用>>时,光标已经通过了您想要获得的位置。

这有一些解决方法。最容易的是

int main(){
    std::ifstream myFile("a.txt");
    std::string line;
    std::string col1, col2, col3;
    while(myFile >> col1 >> col2 >> col3){
        std::cout << col1 << " " << col2 << " " << col3 << std::endl;
    }
return EXIT_SUCCESS;
}

使用stringstreams的另一个是

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>

int main(){
    std::ifstream myFile("a.txt");
    std::string line;
    while(std::getline(myFile, line)){
        std::string col1, col2, col3;
        std::istringstream stream(line);
        copy(std::istream_iterator<std::string>(stream),
        std::istream_iterator<std::string>(),
        std::ostream_iterator<std::string>(std::cout, " "));
        std::cout << std::endl;
    }
    return EXIT_SUCCESS;
}

错误使用逗号运算符

以下行也可能导致问题

myFile >> col1, col2 >> col3;

我的编译器Apple LLVM version 8.1.0 (clang-802.0.38)甚至不允许这样做。 (转载here)所以我想你想要像这样使用逗号运算符,

 myFile >> (col1, col2) >> col3;

逗号运算符执行以下操作:如果您对expression1,expression2 expression1进行了评估,则会expression2进行评估,并返回expression2的结果作为结果整个表达expression1,expression2

让我们一起检查>>,如何协同工作。 Here您可以看到>>绑定强于,(实际上,具有所有C ++运算符最弱的优先级)。

这意味着

myFile >> (col1, col2) >> col3;
          ^^^^^^^^^^^^
          result is col2

具有相同的效果
myFile >> col2 >> col3;
因此未使用

col1。我的编译器(使用-Wall -Wpedantic)给出了警告

  

表达式结果未使用[-Wunused-value]