-1

このコードを保持したいのですが、そのループ内の空白を削除できる場合、while ループでファイルを読み込むときに方法があるかどうか疑問に思っています。

空白を削除する際に多くの問題を抱えています。ファイルをプログラムに読み込むことについてよく理解していないため、これは非常に困難でした。どこで間違いを犯しているのか教えてもらえますか?

#include <iostream>
#include <cassert>
#include <string>
#include <fstream>
#include <cstdio>

using namespace std;

int main (void)
 {
 int i=0;
 int current=0;
 int len;
 int ch;
 string s1;
 string s2;
 ifstream fileIn;
  cout << "Enter name of file: ";
  cin >> s1;
  fileIn.open(s1.data() );
   assert(fileIn.is_open() );

 while (!(fileIn.eof() ) )
  { ch=fileIn.get();
  s1.insert(i,1,ch);
  s1.end(); 
  i++;}



cout << s1;
len=s1.length();
cout << len;

 while (current < len-1)
    {
        if (!(s1[current] == ' ' && s1[current + 1] == ' ') &&
            !(s1[current] == '\n' && s1[current + 1] == '\n')
            )
        {
            s2.append(s1[current]);
        }

        current++;

    }

 return 0;
 }
4

2 に答える 2

1

私が別の方法で行うことはたくさんあります。詳細には触れずに、ここに私が提案するものがあります。C++11 が必要です ( -std=c++11gcc または clang を使用している場合は、コンパイラにも渡します)。

#include <algorithm> 
#include <cctype>
#include <fstream>
#include <functional> 
#include <iostream>
#include <locale>

using namespace std;

// trim from left
static string ltrim(string s) {
        s.erase(s.begin(), find_if(s.begin(), s.end(), [](char c) { return !isblank(c); } ));
        return s;
}

int main() {

  string file_name;

  cout << "Please enter the file name: " << flush;
  cin >> file_name;

  ifstream in(file_name);

  if (!in.good()) {

    cout << "Failed to open file \"" << file_name << "\"" << endl;

    return 1;
  }

  string buffer;

  while (getline(in, buffer)) {

    buffer = ltrim(buffer);

    if (!buffer.empty()) {

      cout << buffer << '\n'; // <-- or write into a file as you need
    }
  }

  return 0;
}

タイトルには、先頭のスペースのみを削除したいというメッセージが表示されていますが、私の質問に対しては、行末から末尾のスペースも削除したいと答えました。そのような場合は、trim()の代わりに使用してltrim()ください。必要な機能は次のとおりです。

// trim from left
static string ltrim(string s) {
        s.erase(s.begin(), find_if(s.begin(), s.end(), [](char c) { return !isblank(c); } ));
        return s;
}

// trim from right
static string rtrim(string s) {
        s.erase(find_if(s.rbegin(), s.rend(), [](char c) { return !isblank(c); }).base(), s.end());
        return s;
}

// trim from both left and right
static string trim(string s) {
        return ltrim(rtrim(s));
}

他にも、おそらくより高速なトリムの実装があります。例を参照してください: std::string をトリミングする最良の方法は何ですか?

于 2013-10-11T14:52:12.040 に答える