-1

定数char*を入力として受け取るAPI関数があります。次のような関数の入力である区切りテキストファイルを作成する必要があります。

193.875 0.0     0.0     2
193.876 0.0     0.0     2
193.877 0.0     0.0     2
193.878 0.0     0.0     2
193.879 0.0     0.0     2
193.880 0.0     0.0     2
193.881 0.0     0.0     2

ソフトウェアのサポート担当者は、 sprintf()を使用してこのファイルのすべての行を作成および保存できると言ったので、次のように使用しました。

sprintf(wsp,"%.3f\t0.0\t0.0\t%d\n", start_freq, z);

この行をループに入れた後、作成したすべてのwspを文字列の配列に保存しました。

for (int j = 0; j < start; j++){

sprintf(wsp,"%.3f\t0.0\t0.0\t%d\n", start_freq, z);
start_freq = start_freq + 0.001;
wspfile[j] = wsp;

}

これで、必要な形式のファイルができましたが、文字列の配列で提供されます。私の質問は、配列を作成した後、この配列を定数char *として渡す方法、または定数char *に変換する方法です。

4

3 に答える 3

1

wspFile を配列ではなく std::string にすることができます。次に、代わりに

wspFile[j]=wsp;

あなたが持っているだろう

wspFile+=wsp;

次に、 const char* バージョンを取得するには、次のように呼び出します

wspFile.c_str();
于 2012-08-19T13:50:15.927 に答える
0

データのサイズを事前に知っているように見えるので、次のようにすることができます。

std::vector<char> wspfile(start * wsp_max_length);
// C-ish way:
/* char* wspfile = (char*) malloc(start * wsp_max_length) */

for (int j = 0; j < start; j++) {
    sprintf(wsp + (wsp_max_length * j), "%.3f\t0.0\t0.0\t%d\n", start_freq, z);
    start_freq = start_freq + 0.001;
}

your_API_func(&wspfile[0]);

より C++ のような方法で:

#include <vector>
#include <sstream>
#include <string>
#include <iomanip>  // for setprecision()

std::vector<char> wspfile;
double start_freq = 193.875;

for (int j = 0; j < start; ++j, start_freq += 0.0001) {

    std::ostringstream oss;
    oss << std::setprecision(3)
        << start_freq
        << "\t0.0\t0.0\t"
        << z << "\n\0";  // your version with sprintf adds '\0', too,
                         // although I'm pretty sure you don't want it

    std::string wsp = oss.str();
    wspfile.insert(wspfile.end(), wsp.begin(), wsp.end());
}

your_API_func(&wspfile[0]);
于 2012-08-19T13:59:54.163 に答える
0

あなたの質問を誤解していないことを願っています。char*N の配列、つまりがあると仮定し始めwspfile[]ますよね?ここで、この配列を単一の文字列に変換したいと思います。

char *join(char **strings, int N)
{
    //Step 1: find out the total amount of memory we need
    int i, total = 0;
    for (i = 0; i < N; i++) {
        total += strlen(strings[i]);
    }

    //Step 2. Allocate resulting string.
    char *str = malloc(total + 1); //Alloc 1 more byte for end \0

    //Step 3. Join strings.
    char *dst = str;
    for (i = 0; i < N; i++) {
        char *src = strings[i];
        while(*src) *dst++ = *src++;
    }
    *dst = 0; //end \0
    return str; //don't forget to free(str) !
}

次に、コードで:

char *s = join(wspfile, N);
/* do whatever with `s`*/
free(s);
于 2012-08-19T14:08:07.540 に答える