std::string' から 'char []' に変換できません。

[戻る]
フジタ [E-Mail] 2010/12/13(月) 13:07:16
C++は全くの初心者です。HPのプログラマをコピペで組み合わせて作りました。

やりたいことはテキストファイルを読み込み、splitのような関数を使ってファイルデー
タ(例:(x,y))をそれぞれ(x[] y[])の配列に入れるということです。

わかる方よろしくお願いします。


#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define MAX_LEN  100


int main()
{
    ifstream fin;
    string ss;

    fin.open("test.txt");
    if (!fin){
        cout << "入力ファイルをオープンできません。\n";
        return 1;
    }

    while (fin >> ss) {
        cout << ss << '\n';
    }

    fin.close();

    return 0;


    



    int i, len;
    char str[] = ss , *words[MAX_LEN], *cp;
    const char *delim = "";

    cp = str;
    for (len = 0; len < MAX_LEN; len++) {
        if ((words[len] = strtok(cp, delim)) == NULL)
            break;
        cp = NULL;
    }
    for (i=0; i<len; i++) {
        puts(words[i]);
    }

    return 0;

}

maru 2010/12/13(月) 14:45:52
> HPのプログラマをコピペで組み合わせて作りました。
「プログラマ:Programmer」とはプログラムを作成する人であり、コピーしたり
ペーストしたりすることはできません。

という突っ込みはおいといて、

やりたいことをもう少し正確にすることをお勧めします。。
テキストファイルに入っているデータ(群?)はどういうフォーマットか?
それをどういう風に配列に入れるのか?
x, yの精度は?
配列の大きさは?
等等。

本題の「std::string' から 'char []' に変換できません。」
ですが、エラーメッセージそのままです。つまり
    char str[] = ss;
この代入ができないといっています。適切な処理を行うことが必要です。
このプログラムはどこかから持ってきたようですが、その段階でエラーがあったは
ずなんですがね。
この str[] は char *cp を通してstrtokに渡しており、strtok の第一引数は書き
換え可能な文字列を渡す必要があるので、安全のためには ss の文字列長を調べ、
その分の文字配列を確保し、ss の内容をそこにコピーする必要がある。
危険ではあるが、strtokは文字列を書き換えるが、長さは変えないことは分かって
いるから c_str関数を使って const char* 型の変数に変換し、キャストを使って
constをはずしてstrtokに渡すって手も有る。
# 動作保障はしませんよ。

あと、見落としでなければ、
>     return 0;
が途中にありますが、これではmain関数が途中で終了していまい、後半が実行され
ません。
さらに
> const char *delim = "";
これでは区切り文字のセットが空なんだけど、strtokの動作はどうなるんだろう?
せっかく ifstream を使っているんだから、ファイルに書かれているフォーマット
を使ってデータの読み込みをすれば strtok なんか使わずに直接配列に取り込むこ
ともできそうなんだけど。

サンプルとなるプログラムを動かして動作を確認しながらプログラムを作っていこう
っていう気持ちは分かるんだけど、まずはソースファイルに書かれている内容を理解
することをお勧めします。まぁがんばってください。

PATIO 2010/12/13(月) 15:43:04
「初心者です」では実際に何処まで勉強されているのかがわかりません。

便利な表現ですが、質問の場ではあまり役に立ちません。
対面で話している状況であれば、簡単に聞き出す事もできますが、
掲示板ではそれも出来ないので結局、最初の段階で本題とは違う
やり取りをしなくてはいけなくなります。
ですから、何処まで勉強しているのかを提示してください。
勉強内容の深さによって説明の内容も変わってくることがあります。

C++言語の文法に関して一通り勉強されているのかどうかは
大きなポイントです。
入門書等で一通りの勉強をされているのであれば、
サンプルベースにソースの解析を行ないながら勉強をするのも
一つの手段になりますが、文法の勉強をまだ終えていないので
あれば、一通りの勉強をする事を先にした方が良いと思います。

既にmaruさんから指摘を受けていますが、
サンプルを使って勉強するのであれば、サンプルソースの内容を
まず理解できることが必要になります。
サンプルソースをただ持って来てみましたでは勉強になりません。
まずは内容をよく読んで一つ一つのステップが何を行なって
いるのかを把握してください。
あと、Web上で得られたサンプルは100%正しいとは考えない方が
良いと思います。サンプルの正しさを判断するのも利用する側の
責任になります。その辺も含めてサンプルを利用するように
した方が良いと思いますよ。

古いスレッドには追加発言できません。