0

これはとても単純な問題のように思えますが、私は苦労しています。私は、ファイル内のすべての文字を char 配列に入れたいだけの大きなファイルを持っています。私の問題は、改行と空白を処理する方法がわからないことです。ファイルを調べてすべての文字を取得し、改行をスキップして配列に入れる方法はありますか?

はい、グーグルで検索しましたが、うまくいきませんでした。

4

4 に答える 4

1

で簡単に行う方法を次に示しますC。インターフェイスを使ってもできると思いますC++が、C ライブラリも C++ の一部です。

#include <stdio.h>
#include <ctype.h>

FILE *f = fopen ("filename", "r");
if (!f)
   error ...

char array [BIGENOUGH];
int index = 0;
while (!feof (f))
{
    char c = fgetc (f);
    if (!isspace (c))
        array [index++] = c;
}
fclose (f):
于 2012-04-19T18:21:11.217 に答える
1

推奨される方法は、標準ライブラリ文字列を使用することです。文字列から空白を削除する例ここここでファイルから行ごとに読み取る方法。

コード例:

fstream file;
file.open("test.txt",ios::in);
while ( !file.eof() ) {
  string str;
  file >> str;

  remove_if(str.begin(), str.end(), isspace);
  str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  //save str here
}

file.close();

remove_ifサンプル実装:

template<typename T, typename P>
T remove_if(T beg, T end, P pred)
{
    T dest = beg;
    for (T itr = beg;itr != end; ++itr)
        if (!pred(*itr))
            *(dest++) = *itr;
    return dest;
}

このコードはテストされていません。

于 2012-04-19T18:21:17.317 に答える
1

C++ で必要なことを行うための鍵は、フォーマットされた入力操作を利用することです。空白を無視したい。フォーマットされた入力メソッドはまさにそれを行います。

標準的な C++ 入力ループを使用する 1 つの方法を次に示します。

#include <fstream>
#include <iostream>

int main () {
  std::ifstream inFile("input.txt");

  char c;
  std::string result;
  while(inFile >> c)
    result.push_back(c);

  std::cout << result;
}

私は手作りのループよりも標準的なアルゴリズムを好みます。を使用して、C++ でそれを行う 1 つの方法を次に示しstd::copyます。この方法と最初の方法はほぼ同じであることに注意してください。

#include <vector>
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>

int main () {
  std::ifstream inFile("input.txt");
  std::string result;
  std::copy(std::istream_iterator<char>(inFile),
            std::istream_iterator<char>(),
            std::back_inserter(result));
  std::cout << result;
}

別の方法で、今回はstd::accumulate. の代わりにstd::accumulate使用するため、一度にファイルを読み取ることができます。operator+push_backstring

#include <vector>
#include <fstream>
#include <numeric>
#include <iostream>
#include <iterator>
#include <algorithm>

int main () {
  std::ifstream inFile("input.txt");
  std::string result =
    std::accumulate(
      std::istream_iterator<std::string>(inFile),
      std::istream_iterator<std::string>(),
      std::string());
  std::cout << result;
}
于 2012-04-19T18:32:12.800 に答える
0

fgets改行まで読み取ることができます (改行は宛先バッファーにまだ存在することに注意してください。必ず '\0' で上書きしてください)。
ファイルを 1 行ずつ読み取り、そのたびに出力を前の出力と連結します。

于 2012-04-19T18:23:30.170 に答える