fstream
txtファイルを読むために使用したかった。
を使用してinFile >> characterToConvert
いますが、問題は、スペースと改行が省略されていることです。
私は暗号化プログラムを書いているので、スペースと改行を含める必要があります。
これを達成するための適切な方法は何でしょうか?
rdbuf()
おそらく最良の方法は、ファイルの内容全体を文字列に読み込むことです。これは、ifstreamのメソッドを使用して非常に簡単に実行できます。
std::ifstream in("myfile");
std::stringstream buffer;
buffer << in.rdbuf();
std::string contents(buffer.str());
ファイルからすべてを取得したので、通常の文字列操作を使用できます。
Tomekがテキストファイルの読み取りについて質問している間、バイナリデータの読み取りにも同じアプローチが機能しますが、入力ファイルストリームを作成するときにstd :: ios::binaryフラグを指定する必要があります。
暗号化については、ファイルをバイナリモードで開くことをお勧めします。次のようなものを使用して、ファイルのバイトをベクトルに入れます。
std::ifstream ifs("foobar.txt", std::ios::binary);
ifs.seekg(0, std::ios::end);
std::ifstream::pos_type filesize = ifs.tellg();
ifs.seekg(0, std::ios::beg);
std::vector<char> bytes(filesize);
ifs.read(&bytes[0], filesize);
編集:コメントに従って微妙なバグを修正しました。
私はこれをテストしていませんが、「空白をスキップ」フラグをクリアする必要があると思います。
inFile.unsetf(ios_base::skipws);
C++ストリームには次のリファレンスを使用します 。IOstreamライブラリ
std::ifstream ifs( "filename.txt" );
std::string str( ( std::istreambuf_iterator<char>( ifs ) ),
std::istreambuf_iterator<char>()
);
次のC++コードは、ファイル全体を読み取ります...
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
string line;
ifstream myfile ("foo.txt");
if (myfile.is_open()){
while (!myfile.eof()){
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}
return 0;
}
あなたのコードを投稿してください、そして私はあなたにあなたの問題にもっと具体的な助けを与えることができます...
istreamレイヤーの多くの利点は、単純な型roおよびストリームからの基本的なフォーマットと解析を提供することです。あなたが説明する目的のために、これのどれも本当に重要ではなく、あなたはバイトのストリームとしてファイルに興味があるだけです。
これらの目的のために、filebufによって提供されるbasic_streambufインターフェースを使用する方が良い場合があります。「空白をスキップ」の動作は、必要のないistreamインターフェイス機能の一部です。
filebufはifstreamの基礎になっていますが、直接使用することは完全に有効です。
std::filebuf myfile;
myfile.open( "myfile.dat", std::ios_base::in | std::ios_base::binary );
// gets next char, then moves 'get' pointer to next char in the file
int ch = myfile.sbumpc();
// get (up to) the next n chars from the stream
std::streamsize getcount = myfile.sgetn( char_array, n );
また、関数snextc('get'ポインターを前方に移動してから現在のcharを返す)、sgetc(現在のcharを取得するが、'get'ポインターは移動しない)およびsungetc('get'をバックアップする)も見てください。可能であれば、1つの位置によるポインタ)。
istreamクラスによって提供される挿入および抽出演算子が不要で、基本的なバイトインターフェイスのみが必要な場合、多くの場合、streambufインターフェイス(filebuf、stringbuf)がistreamインターフェイス(ifstream、istringstream)よりも適切です。
int fstream::get()
ストリームから 1 文字を読み取る を呼び出すことができます。複数の文字に対してistream& fstream::read(char*, streamsize)
と同じ操作を行う を使用することもできます。get()
指定されたリンクには、各方法の使用例が含まれています。
バイナリモードで読み書きすることもお勧めします。これにより、ASCII 制御文字をファイルから適切に読み書きできます。そうしないと、暗号化/復号化操作のペアによって、同一でないファイルが生成される可能性があります。これを行うには、フラグを使用してファイル ストリームを開きますios::binary
。バイナリ ファイルでは、read()
メソッドを使用する必要があります。
別のより良い方法は、istreambuf_iterator を使用することです。サンプル コードは次のとおりです。
ifstream inputFile("test.data");
string fileData(istreambuf_iterator<char>(inputFile), istreambuf_iterator<char>());
暗号化には、おそらくread()を使用する必要があります。暗号化アルゴリズムは通常、固定サイズのブロックを処理します。ああ、バイナリモード(frmo \ n \rから\nへの変換なし)で開くには、コンストラクターまたはopen()呼び出しの2番目のパラメーターとしてios_base::binaryを渡します。
ifstream ifile(path);
std::string contents((std::istreambuf_iterator<char>(ifile)), std::istreambuf_iterator<char>());
ifile.close();
単純
#include <fstream>
#include <iomanip>
ifstream ifs ("file");
ifs >> noskipws
それで全部です。
Charles Bailey が正しく指摘したように、バイトを読み取るためだけに fstream のサービスは必要ありません。したがって、この iostream の愚かさは忘れて、fopen/fread を使用して作業を完了してください。C stdio は C++ の一部です。