2012-04-19 22 views
0

これはこのような単純な問題のようですが、私はそれに苦労しています。私は大きなファイルを持っているだけで、ファイル内のすべてのcharをchar配列に入れたいと思っています。私の問題は、改行や空白をどう扱うべきか分かりません。ファイルを調べてすべての文字を取得し、改行をスキップして配列に入れる方法はありますか?C++:改行と空白を無視してファイルのすべての文字を取得する

はい、Googleで検索しましたが、運はありません。

+0

ゲノムでの読み込みは、私は推測していますか? – cmo

答えて

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): 
+0

私はあなたが配列 –

+0

の最後にあるEOFを削除する必要があると思うこれは完璧に働いた。どうもありがとうございました。私はfstreamライブラリを使用しようとしていた。これははるかに簡単です。 – LiverpoolFTW

0

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

例コード:

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; 
} 

このコードは未検証です。

0

fgetsは、改行が終わるまで読むことができます(宛先バッファに改行が残っていることに注意してください)ので、必ず '\ 0'で上書きしてください。
ファイルを1行ずつ読み込み、毎回出力を前の出力と連結します。

1

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

は正規C++入力ループを使用して、一つの方法である:

#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; 
} 

Iはループに細工を手に標準的なアルゴリズムを好みます。 std::copyを使って、C++でそれを行う1つの方法があります。この方法と最初の方法はほぼ同じです。

#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::accumulatepush_backの代わりにoperator+を使用するので、一度にstringのファイルを読むことができます。

#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; 
}