Обратная строка из файла в c ++ с использованием векторов - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь написать программу, которая читает текст из файла (только строки) и переворачивает его. Следующий код делает это, но он не учитывает пробелы между словами:

#include<iostream>
#include<vector>
#include<fstream>


using namespace std; 

int main(){

    ifstream file("file.txt");
    char i;
    int x;
    vector<char> vec;

    if(file.fail()){
        cerr<<"error"<<endl;
        exit(1);
    }



    while(file>>i){
        vec.push_back(i);
    }

    x=vec.size(); 

    reverse(vec.begin(), vec.end());

    for(int y=0; y<x; y++){
        cout<<vec[y];
    }


    return 0;
}

Если текст в файле «dlroW olleH», программа выведет «HelloWorld». Что я могу сделать, чтобы он напечатал «Hello World» (с пробелом между обоими словами)?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Как указал user4581301, >> автоматически пропустит любой пробел.Вы можете отключить это, используя std::noskipws потоковый манипулятор и изменив file>>i на file>>std::noskipws>>i.Лучшее решение в целом - просто использовать std::getline для считывания всей строки в std::string, перевернуть ее и распечатать вместо обработки отдельных символов.

#include <string>
#include <fstream>
#include <iostream>
#include <algorithm>
int main()
{
    std::ifstream file("input.txt");
    //insert error checking stuff here
    std::string line;
    std::getline(file, line);
    //insert error checking stuff here
    std::reverse(line.begin(), line.end());
    std::cout << line << '\n';
}

Просто примечание о вашем кодеВы должны объявлять переменные только тогда, когда они используются.Например, ваша переменная x используется только в конце программы, но она объявляется полностью вверху.using namespace std также можно считать плохой практикой .

0 голосов
/ 25 апреля 2018

Функция reverse работает отлично, проблема в следующем:

while(file>>i){

std::operator>> пропускает пробелы и новые строки, вам нужно будет использовать std::istream::getline, чтобы избежать этого или попробовать std::noskipws манипулятор.

Использование:

#include <iostream>     // std::cout, std::skipws, std::noskipws
#include <sstream>      // std::istringstream

int main () {
  char a, b, c;

  std::istringstream iss ("  123");
  iss >> std::skipws >> a >> b >> c;
  std::cout << a << b << c << '\n';

  iss.seekg(0);
  iss >> std::noskipws >> a >> b >> c;
  std::cout << a << b << c << '\n';
  return 0;
}

Выход:

123
  1
...