7

文字配列を使用して stdout に書き込む最も簡単な方法は何ですか? はるかに大きな配列のスライスを出力したいのですが、スライスは null で終了していません。スライスを「適切な」null で終わる c-string にコピーすることは避けたいと思います。

4

5 に答える 5

13

最初は見つけられなかった非常に明白な解決策があります。std::coutのインスタンスですostream

void WriteChunk(char *buffer, size_t startpos, size_t length) {
    std::cout.write(buffer + startpos, length);
}

std::cout.writeトリックもそうです。

于 2013-08-28T18:16:25.627 に答える
4

std::copyあなたが望むことを正確に行うようです:

#include <iostream>    // for std::cout
#include <algorithm>   // for std::copy
#include <iterator>    // for std::ostream_iterator

//...
char arr[] = "abcdefij";

std::copy(arr + 2, arr + 5, std::ostream_iterator<char>(std::cout, ""));

この例では、標準出力に書き込みます: cde.

これがライブの例です

于 2013-08-28T18:17:18.067 に答える
1

文字配列の境界がわかっている場合は、次のように記述できます。

char* arr = new char[N];
for(size_t i = min_indx; i < max_indx; ++i) {
  cout << arr[i];
}

min_indx が 0 から N-1 の間にあり、max_indx が 0 から N の間にあることを確認する必要があります。

私たちは皆、ライブラリ関数で物事を行うのが好きなので、 を使用してそれを行う方法を次に示しますstd::copy

copy(arr + min_indx, arr + max_indx, ostream_iterator<char>(cout, ""));
于 2013-08-28T18:07:46.637 に答える
1

ostream::write動作するはずです。

#include <iostream>
int main() {
    char a[] = "ABCDEFGHIJ";
    std::ostream out(std::cout.rdbuf());
    out.write(a, 2);
}

編集

std::coutostream オブジェクト自体と同様に、別の ostream オブジェクトを作成する必要はありません。それでstd::cout.write十分です。

于 2013-08-28T18:17:20.060 に答える
1

わかりました、これは「ばかげたアイデアの部門」です。

 class partial_print_wrapper
 {
   private:
     const char *str;
     int start;
     int end;
   public:
     partial_print_wrapper(const char *s, int st, int en) : str(s), start(st), end(en) {}
     friend ostream& operator <<(ostream &os, const partial_print_wrapper& pw);
 };

 ostream& operator <<(ostream &os, const partial_print_wrapper& pw)
 {
     for(int i = pw.start; i < pw.end; i++)
     {
         os << pw.str[i];
     }
     return os;
 }

 char *s = "Something quite long";

 cout << print_string_wrapper(s, 3, 8) << endl;
于 2013-08-28T18:11:36.973 に答える