3

ppmファイル(画像形式)をディスクに書き込む機能があります。ファイル名を char* 配列として受け取ります。メイン関数では、stringstream と << 演算子を使用してファイル名をまとめました。次に、この結果を ppm 関数に渡します。私はこれが他の場所で議論されているのを見たことがあります.

私が行ったことは以下のコードに示されています。他の人が一時変数を使用して多くのステップで通常行うトリッキーな部分は(char*) (PPM_file_name.str().data()). これにより、.str() を使用して stringstream PPM_file_name から文字列を抽出し、.data() を使用して実際のコンテンツへのポインターを取得し (これは const char*)、それを通常の (char*) にキャストします。以下のより完全な例。

これまでのところ、次の方法で問題なく動作することがわかりましたが、他の人が一見複雑な方法で何かを行った場合、それはより安全な方法であるため、通常は不安になります. それで、私がここでやっていることは安全で、移植性が高いかどうか誰か教えてもらえますか?

ありがとう。

#include <iostream>
#include <sstream>
#include <stdio.h>
#include <string>
using namespace std;

int main(int argc, char *argv[]){

    // String stream to hold the file name so I can create it from a series of other variable
    stringstream PPM_file_name; 

    // ... a bunch of other code where int ccd_num and string cur_id_str are created and initialized

    // Assemble the file name
    PPM_file_name << "ccd" << ccd_num << "_" << cur_id_str << ".ppm";

    // From PPM_file_name, extract its string, then the const char* pointer to that string's data, then cast that to char*
    write_ppm((char*)(PPM_file_name.str().data()),"ladybug_vidcapture.cpp",rgb_images[ccd_num],width,height);                   

    return 0;
}
4

6 に答える 6

3

みんな、ありがとう。したがって、ここでいくつかの人々の提案に従って、write_ppmを制御できるため、次のことを行いました。

const char* を取るように write_ppm を変更:

void write_ppm(const char *file_name, char *comment, unsigned char *image,int width,int height)

そして今、次のように ppm_file_name を渡しています。

write_ppm((PPM_file_name.str().c_str()),"A comment",rgb_images[ccd_num],width,height);

ここで私がすべきことはありますか、それともこれが以前に渡された方法に関する問題をほとんど解決していますか? write_ppm への他のすべての char 引数も const にする必要がありますか? これは非常に短い関数であり、引数を変更するようには見えません。ありがとう。

于 2010-11-12T17:36:41.697 に答える
2

これは、誰かがconst-correctコードを記述しておらず、ノックオン効果がある典型的なケースのように見えます。いくつかの選択肢があります。

  • write_ppmがあなたの管理下にある場合、またはあなたが知っている人の管理下にある場合は、それをconstcorrctにするように依頼してください

  • そうでない場合、ファイル名が変更されないことを保証できます。次にconst_cast

  • それを保証できない場合は、文字列をstd :: vectorとnullターミネータにコピーし、&vec [0](vecはベクトル変数の名前を表します)を渡します。

于 2010-11-11T16:57:30.810 に答える
1
  1. nullで終了する文字列を返すことが保証されていないためPPM_file_name.str().c_str()、を使用する必要があります。data()

  2. write_ppm()最初の引数を(文字列の内容を変更しないことを約束して)取るかconst char*、文字列ストリームを渡してはなりません(そのように内容を変更してはならないため)。

C ++ではCスタイルのキャストを使用しないでください。これは、キャストするさまざまな理由を区別しないためです。あなたは捨て去ってconstいます、もしあるとしても、それはを使って行われるべきconst_cast<>です。しかし、経験則として、const_cast<>通常は正しくないコードをコンパイルするためにのみ必要でありconst、これはエラーと見なされます。

于 2010-11-11T16:53:53.363 に答える
1

write_ppmが実際に引数を変更しない限り、それは絶対に安全で移植可能です。その場合、それは未定義の動作です。const_cast<char*>Cスタイルのキャストの代わりに使用することをお勧めします。c_str()メンバーの代わりにメンバーを使用することも検討してdata()ください。前者は、nullで終了する文字列を返すことを保証します

于 2010-11-11T16:54:18.330 に答える
0

(文字の終了シーケンスを返す)のc_str()代わりに使用します。data()c_str()NULL

于 2010-11-11T16:53:33.553 に答える
0

単純に使ってみませんconst_cast<char *>(PPM_file_name.str().c_str())か?

于 2010-11-11T16:54:22.037 に答える