ifstream と getline を使用して入力ファイルを 1 行ずつ読み取っています (たとえばstring line
)。そしてstring line
、最初の文字を削除してファイルに出力する必要があります。私がやっていることはerase
、行の最初の文字を ing し、ofstream を使用して出力することです。それを行うためのより良い方法はありますか(比較的速い方法を意味します)?何百万もの文字列があります。(これはすべての行に当てはまるわけではなく、10 行ごとの最初の行にのみ当てはまることに注意してください)。
4 に答える
最初に最も単純なアプローチを試して、それが十分に速いかどうかを確認します。
if (!mystring.empty())
std::copy( mystring.begin() + 1, mystring.end(),
std::ostreambuf_iterator<char>(stream_object) );
<algorithm>
および<iterator>
ヘッダーが必要です。
実際の文字列ポインタ + 1 を出力できます。
outputStream << (line.c_str() + 1);
ただし、最初に文字列が空でないことを確認することをお勧めします。そうしないと、不正なポインターにアクセスしてしまう可能性があります。
部分文字列を出力したい場合は、std::string::substr
関数があります。または、std::ostream::write
上記のポインター演算と組み合わせて関数を使用します。
outputStream.write(line.c_str() + 1, 9); /* 1st to 10th character */
上記の場合、文字列の長さが少なくとも 10 文字であることを確認する必要があります。
注:極端な状況でない限り、私は個人的にこの回答で概説されているものとして「ハック」を使用しません。部分文字列関数が存在するのには理由があり、これを使用することをお勧めします。
おそらく、最初の文字なしで文字列全体を書き込む最速の方法は、@JoachimPileborg の回答によるものです。しかし、1 番目から 10 番目までの 10 文字を書きたい場合、最速の方法はfwrite
の代わりに関数を使用することですfstream
。
fwrite( line.c_str() + 1, 1, 10, file );
非常に正確に使用する必要があることに注意してください。その行には 10 文字以上あるのでご安心ください。
std::string を使用していると思います...
std::string str; // contains the line
str.substr (1, str.length() - 1); // gives you what you need
ベスト、アコス