電子書籍の厳選無料作品が豊富!

C++でcsvファイルから文字列を取得するというものを作っているのですが、うまく取り出すことができません。ファイルはオープンできて、文字列にも分けられているのだとは思うのですが、どこのデータを表示させても"1aa"としか表示されません。なにも格納されていない所は"1aa"とは表示されず空白ですが。

以下に取り出す際使用しているコードを記載するので、うまい具合にいくアドバイスがありましたらお願いします。


↓で格納させる場所を作っています。
typedef struct
{
char* Input;
char* Output;
char* AddName;
char* Path;
char* LED;
int VS;
char* Title;
char* Copy;
} csvdata_t;

csvdata_t csvdata[100]として別の場所で宣言してます

↓この関数で格納させています
void loadData(){
    FILE *fp;
   fp = fopen(csvTitle,"r");//ここでのファイルパスは通っています
   int n,num,i;
       int input[1024];
char inputc[1024];
for(i = 0; i < 1; i++)//最初の1行読み飛ばす
while(fgetc(fp) != '\n');
n = 0;
num = 0;

while(1){
for(i = 0;i < 64; i++){
inputc[i] = input[i];// = fgetc(fp);//1文字取得する
input[i] = fgetc(fp);
if(inputc[i] == '/'){//スラッシュがあれば
while(fgetc(fp) != '\n');//改行までループ
i = -1;//カウンタを最初に戻して
continue;
}
if(input[i] == ',' || input[i] == '\n'){//カンマか改行なら
inputc[i] = '\0';//そこまでを文字列とし
break;
}
if(input[i] == EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){
case 0: csvdata[n].Input = inputc;break;
case 1: csvdata[n].Output = inputc;break;
case 2: csvdata[n].AddName = inputc;break;
case 3: csvdata[n].Path = inputc;break;
case 4: csvdata[n].LED = inputc;break;
case 5: csvdata[n].VS = atoi(inputc);break;
case 6: csvdata[n].Title = inputc;break;
case 7: csvdata[n].Copy = inputc;break;
case 8: break;
}
num++;
if(num == 9){//9まできたら
num = 0;//0に戻す
n++;//次の行へ
}
}
EXFILE:
fclose(fp);
}

A 回答 (1件)

>void loadData(){


>    FILE *fp;
>   fp = fopen(csvTitle,"r");//ここでのファイルパスは通っています
>   int n,num,i;
>       int input[1024];
>char inputc[1024];

inputc[]は「ローカル変数」で間違いないですかね?

>switch(num){
>case 0: csvdata[n].Input = inputc;break;
>case 1: csvdata[n].Output = inputc;break;
>case 2: csvdata[n].AddName = inputc;break;
>case 3: csvdata[n].Path = inputc;break;
>case 4: csvdata[n].LED = inputc;break;
>case 5: csvdata[n].VS = atoi(inputc);break;
>case 6: csvdata[n].Title = inputc;break;
>case 7: csvdata[n].Copy = inputc;break;
>case 8: break;
>}

で、ローカル変数へのポインタを代入しているようですが…
さて「ローカル変数」の寿命(有効期間)はいつまでだったか学習しましたか?
# csvdata[n].VSだけポインタではなく数値の代入なので正しく動作するかと。

>どこのデータを表示させても"1aa"としか表示されません。

ただの偶然です。
不正終了してもまったく不思議のないコードになってます。
で、どのデータも同じアドレス指していますから、「どこのデータ」だろうが同じ動作します。
# ポインタに入っているアドレス確認してみましょうね。

>うまい具合にいくアドバイスがありましたらお願いします。

個別に、動的にメモリ確保して保持して下さい。
もちろん、不要になったら破棄して下さい。
malloc()/free()とかですね。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。
頂いたアドバイスを元に試行錯誤の上、なんとか思い通りによみ込めるようになりました。

お礼日時:2011/04/18 08:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!