0

ifstream と getline を使用して入力ファイルを 1 行ずつ読み取っています (たとえばstring line)。そしてstring line、最初の文字を削除してファイルに出力する必要があります。私がやっていることはerase、行の最初の文字を ing し、ofstream を使用して出力することです。それを行うためのより良い方法はありますか(比較的速い方法を意味します)?何百万もの文字列があります。(これはすべての行に当てはまるわけではなく、10 行ごとの最初の行にのみ当てはまることに注意してください)。

4

4 に答える 4

2

最初に最も単純なアプローチを試して、それが十分に速いかどうかを確認します。

if (!mystring.empty())
    std::copy( mystring.begin() + 1, mystring.end(),
        std::ostreambuf_iterator<char>(stream_object) );

<algorithm>および<iterator>ヘッダーが必要です。

于 2013-02-11T10:08:44.193 に答える
1

実際の文字列ポインタ + 1 を出力できます。

outputStream << (line.c_str() + 1);

ただし、最初に文字列が空でないことを確認することをお勧めします。そうしないと、不正なポインターにアクセスしてしまう可能性があります。

部分文字列を出力したい場合は、std::string::substr関数があります。または、std::ostream::write上記のポインター演算と組み合わせて関数を使用します。

outputStream.write(line.c_str() + 1, 9);  /* 1st to 10th character */

上記の場合、文字列の長さが少なくとも 10 文字であることを確認する必要があります。

注:極端な状況でない限り、私は個人的にこの回答で概説されているものとして「ハック」を使用しません。部分文字列関数が存在するのには理由があり、これを使用することをお勧めします。

于 2013-02-11T08:13:23.117 に答える
0

おそらく、最初の文字なしで文字列全体を書き込む最速の方法は、@JoachimPileborg の回答によるものです。しかし、1 番目から 10 番目までの 10 文字を書きたい場合、最速の方法はfwriteの代わりに関数を使用することですfstream

fwrite( line.c_str() + 1, 1, 10, file );

非常に正確に使用する必要があることに注意してください。その行には 10 文字以上あるのでご安心ください。

于 2013-02-11T08:21:36.500 に答える
0

std::string を使用していると思います...

std::string str;  // contains the line
str.substr (1, str.length() - 1); // gives you what you need

ベスト、アコス

于 2013-02-11T08:15:50.763 に答える