これはこのような単純な問題のようですが、私はそれに苦労しています。私は大きなファイルを持っているだけで、ファイル内のすべてのcharをchar配列に入れたいと思っています。私の問題は、改行や空白をどう扱うべきか分かりません。ファイルを調べてすべての文字を取得し、改行をスキップして配列に入れる方法はありますか?C++:改行と空白を無視してファイルのすべての文字を取得する
はい、Googleで検索しましたが、運はありません。
これはこのような単純な問題のようですが、私はそれに苦労しています。私は大きなファイルを持っているだけで、ファイル内のすべてのcharをchar配列に入れたいと思っています。私の問題は、改行や空白をどう扱うべきか分かりません。ファイルを調べてすべての文字を取得し、改行をスキップして配列に入れる方法はありますか?C++:改行と空白を無視してファイルのすべての文字を取得する
はい、Googleで検索しましたが、運はありません。
ここでは、どうやって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):
私はあなたが配列 –
の最後にあるEOFを削除する必要があると思うこれは完璧に働いた。どうもありがとうございました。私はfstreamライブラリを使用しようとしていた。これははるかに簡単です。 – LiverpoolFTW
推奨される方法は、標準ライブラリ文字列を使用することです。文字列から空白を削除する例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;
}
このコードは未検証です。
fgets
は、改行が終わるまで読むことができます(宛先バッファに改行が残っていることに注意してください)ので、必ず '\ 0'で上書きしてください。
ファイルを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::accumulate
はpush_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;
}
ゲノムでの読み込みは、私は推測していますか? – cmo