为什么我得到相同的字符串输出?

时间:2017-06-13 04:23:25

标签: c++

我无法获得以下功能的预期输出。

in.txt文件

-rw-r--r--  1 air  staff  StructEx.cpp
-rw-r--r--  1 air  staff  Struct2ex.cpp
drwxr-xr-x  3 air  staff  app.dSYM
-rw-r--r--  1 air  staff  MyStruct.cpp
  

例外 - 从上面的in.txt文件中打印第1列和第4列内容。像下面的一些事情

-rw-r--r--StructEx.cpp
-rw-r--r--Struct2ex.cpp
drwxr-xr-xapp.dSYM
-rw-r--r--MyStruct.cpp
  

实际输出 -

-rw-r--r--tructEx.cpp
-rw-r--r--tructEx.cpp
-rw-r--r--tructEx.cpp
-rw-r--r--tructEx.cpp

以上输出错误,我在下面的字符串流函数中遗漏了什么。

  void readingFromFile2(){

      ifstream inputFile("in.txt");
      string line;
      stringstream entireLine;
      char s = ' ';
        string p1, p2, p3, p4, p5;

      while(!inputFile.fail()){
        getline(inputFile, line);
        entireLine << line;
        entireLine >> p1 >> s >> p2 >> s >> p3 >> s >> p4 >> s >> p5 ;
        cout << p1 << p4 << endl ;
      }

    }

从重要评论编辑,我认为下面的功能更有意义,但仍然是相同的

void readingFromFile2(){

  ifstream inputFile("in.txt");
  string line;
  stringstream entireLine;
  char s = ' ';
    string p1, p2, p3, p4, p5;
    char n ='\n';

  while(getline(inputFile, line)){
    entireLine << line;
    entireLine >> p1  >> p2  >> p3  >> p4  >> p5 ;
    cout << p1 <<  p4  << endl ;
  }
}

更新 - 整个代码

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

void readingFromFile2();

int main(){
  readingFromFile2();
}

void readingFromFile2(){

  ifstream inputFile("in.txt");
  string line;
  stringstream entireLine;
  string p1, p2, p3, p4, p5;
  while(getline(inputFile, line)){
    entireLine << line;
    entireLine >> p1  >> p2  >> p3  >> p4  >> p5 ;
    cout << p1 << p2 << p3 << p3 << p4 << p5 << endl ;
  }
}

现在正在运作, 使用stringstream entireLine(line);代替entireLine << line;

1 个答案:

答案 0 :(得分:5)

使用>>进行流输入时,您应该使用

  entireLine >> p1 >> p2 >> p3 >> p4 >> p5 ;

因为空格(' '\t\n)会被忽略。

<强>更新

为什么&#34; -rw-r-r-- 1空气人员StructEx.cpp&#34;使用tructEx.cpp时,会staff代替entireLine >> p1 >> s >> p2 >> s >> p3 >> s >> p4 >> s >> p5 ;吗?

让我们一步一步地看:

1)entireLine >> p1

字符串直到第一个空格被读取到p1-rw-r--r--转到p1

2)entireLine >> s

跳过该空格,1转到s

3)entireLine >> p2

跳过该空格,air转到p2

4)entireLine >> s

跳过该空格,sstaff的开头)转到s

5)entireLine >> p3

只需阅读taffp3

即可

6)entireLine >> s

跳过该空格,SStructEx.cpp的开头)转到s

7)entireLine >> p4

最终我们有p4的价值,这是tructEx.cpp,因为S是在步骤6)到s

更新2

简化演示:

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main() {
    string line = "-rw-r--r--  1 air  staff  StructEx.cpp";
    stringstream entireLine;
    char s = ' '; // not required
    string p1, p2, p3, p4, p5;
    char n = '\n'; // not required

    entireLine << line;
    entireLine >> p1 >> p2 >> p3 >> p4 >> p5;
    cout << p1 << ", " << p2 << ", " << p3 << ", " << p4 << ", " << p5 << endl;

    return 0;
}

给出

enter image description here

但是

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main() {
    string line = "-rw-r--r--  1 air  staff  StructEx.cpp";
    stringstream entireLine;
    char s = ' '; // initialization has no sense
    string p1, p2, p3, p4, p5;
    char n = '\n'; // not required

    entireLine << line;
    entireLine >> p1 >> s >> p2 >> s >> p3 >> s >> p4 >> s >> p5; // HERE!!!
    cout << p1 << ", " << p2 << ", " << p3 << ", " << p4 << ", " << p5 << endl;

    return 0;
}

产生

enter image description here

最终更新

void readingFromFile2(){

    ifstream inputFile("in.txt");
    string line;
    //stringstream entireLine;
    string p1, p2, p3, p4, p5;
    char str[51];
    while (getline(inputFile, line)){
        stringstream entireLine(line); //entireLine << line;
        entireLine >> p1 >> p2 >> p3 >> p4 >> p5;
        cout << p1 << p4 << endl;
    }
}