fscanfで格納された変数がおかしいです。
ダブルポインタで定義した変数にfscanfでファイルから文字列データを読み込んでいるのですが
表示がおかしな事になっています。
読み込んだファイルの内容は、
aiueo
kakikueko
sasisuseso
tatituteto
です。
表示された結果が
kakikueko
sasisuseso
tatituteto
kakisasitatituteto
sasitatituteto
tatituteto
自分では解決しずらいのでここで質問をさせて頂くことになりました。
C/C++で記述してあるのですが、以下にソースを載せておきますのでご指摘ください。
/*
double pointa
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 256
char** size;
// TEST
void test(void)
{
for(int l = 0; l < 3; l++) {
printf("\n%s", &size[l]);
}
}
int main()
{
FILE* fp;
int c = -1;
char moji[MAXSIZE];
if((fp = fopen("test.txt","rb")) == NULL) {
printf("error");
exit(1);
}
while(fscanf(fp,"%s",moji) != EOF) c++;
size = (char**)malloc(sizeof(char) * MAXSIZE * c);
// 初めに戻す
fseek(fp, 0, SEEK_SET);
// 最初の文だけ取り出す
fscanf(fp,"%s",moji);
// 一文を格納する
for(int l = 0; fscanf(fp, "%s", &size[l]) != EOF; l++) {
printf("\n%s", &size[l]);
}
printf("\n");
test();
fclose(fp);
getchar();
free(size);
return 0;
}
test関数内で表示するとおかしな結果がでるのですが何故かわかりません。
よろしくお願いします。
No.7ベストアンサー
- 回答日時:
どうもめちゃくちゃ書きすぎてました & 最後まで動かしてなかった
まず #4 にしたがった修正するなら char ** では無くて char * としてください
どうしてもchar** にしたいのであれば
>size = (char**)malloc(sizeof(char) * MAXSIZE * c);
の部分を
size = (char**)malloc(sizeof(char *) * MAXSIZE * c);
とする必要があります
ただしこの場合実際に格納しているのはファイルの読み取りデータであって
確保した変数名と型が一致してないのでとっても分かりずらいプログラムになります
今度一応ちゃんとプログラム通したから合ってるはず・あっててくれ
>まず #4 にしたがった修正するなら char ** では無くて char * としてください
コンパイルしたら無事にできました。
普通のポインタでのやり方でも問題なくできそうですね。
>どうしてもchar** にしたいのであれば
こっちの方も無事にできました。
ダブルポインタにたいしてもっと勉強しておこうと思います。
何より無事に解決できました。
No.6
- 回答日時:
Microsoft VSコンパイラで同様のエラーメッセージが確認できました。
error C2440: '=' : 'char *' から 'char (*)[256]' に変換できません。
そうなら、行番号も分かっているので、機械的に
(char*)malloc();
から
(char(*)[MAXSIZE])malloc();
gcc -std=C99 ではWエラーでしたので、一発正解にならなくてすみません。
にしても、結局Microsoftのエラーメッセージは親切ですね。
なるほど。
char (*)[MAXSIZE]で char *size[MAXSIZE]に対応することができるんですね。
冷静に考えれば、 配列へのポインタ型ですから当然ですよね。
回答ありがとうございます。
No.5
- 回答日時:
こんちには、初投稿なのでインデントのしかたが分からなくて見ずらいかも知りません、ご勘弁を。
ポインタの配列つまりダブルポインタと、2次元配列の区別を勉強しするといいです。
コメントの//側を採用しても同じ動作です、理由は私も詳しくは知りませんが、&は付けなくて大丈夫です。
/*
double pointa
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 256
//char** size;
char (*size)[MAXSIZE];
// TEST
void test(void)
{
for(int l = 0; l < 3; l++) {
printf("\n%s", &size[l]);
}
//printf("\n%x %x", &size[1], &size[1], size[1]);
//for(int l = 0; l < 3; l++) {
//printf("\n%s", size[l]);
//}
}
int main()
{
FILE* fp;
int c = -1;
char moji[MAXSIZE];
if((fp = fopen("test.txt","rb")) == NULL) {
printf("error");
exit(1);
}
while(fscanf(fp,"%s",moji) != EOF) c++;
size = (char*)malloc(sizeof(char) * MAXSIZE * c);
// 初めに戻す
fseek(fp, 0, SEEK_SET);
// 最初の文だけ取り出す
fscanf(fp,"%s",moji);
// 一文を格納する
for(int l = 0; fscanf(fp, "%s", &size[l]) != EOF; l++) {
printf("\n%s", &size[l]);
}
//for(int l = 0; fscanf(fp, "%s", size[l]) != EOF; l++) {
//printf("\n%s", size[l]);
//}
printf("\n");
test();
fclose(fp);
getchar();
free(size);
return 0;
}
ご回答ありがとうございます。
ポインタの配列で上記のソースのようにしたのですが、
error C2440: '=' : 'char *' から 'char (*)[256]' に変換できません。
というエラーがでてきます。
ポインタ配列での取得の仕方がおかしいみたいなんです。
No.3
- 回答日時:
#1#2 ぼけまくってます 再訂正
sizeはダプルポインタの型定義してるだけで
size[0]/size[1]・・・・
に256バイトのバッファ先頭アドレスはいってるわけではありません
>for(int l = 0; fscanf(fp, "%s", &size[l]) != EOF; l++) {
これでは全体で確保したバッファのポインタポンのアドレスを
インクリメントしたバッファアドレスを渡してるだけです
読み込みしながらの表示では見た目上問題ありませんが
最後のtest関数では表示がおかしくなります
No.2
- 回答日時:
#1訂正 ちゃんと見てなかった
2回目のtest関数では文字の終端がNULL(0)になってないので
そのように表示されます
読み込み直後はたまたま0が入ってるだけ
本来意識的にクリアするなどの方法を取らないと
潜在的なバグになります
No.1
- 回答日時:
>size = (char**)malloc(sizeof(char) * MAXSIZE * c);
行数カウントする際に c をインクリメント
しかも -1 で初期化しているので実行数と取得した行数が食い違います
>// 最初の文だけ取り出す
>fscanf(fp,"%s",moji);
ここで既にファイルポインタが移動するので次の読み込みは
kakikueko
が読み込まれます
>// 一文を格納する
>for(int l = 0; fscanf(fp, "%s", &size[l]) != EOF; l++) {
>printf("\n%s", &size[l]);
>test();
上ではやってることは結果として同じ
(結果として読み込みファイルの2行目から最後までを2回表示してるだけ)
実行結果がおかしいわけではありません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ガンマ変換 C言語でプログラ...
-
エラーがわかりません、、
-
C言語にてXMLファイルから任意...
-
クリップボードから画像取得
-
大量の入力ファイルを扱うとき...
-
Cで文字列の分割
-
C言語 連番データの読み込み
-
_popen() のエラー取得
-
ファイル出力で改行を入れたい!
-
2÷3などの余りについて
-
構文エラー";"が型の前にあり...
-
信頼区間の1.96や1.65ってどこ...
-
変数とパラメータとは違うもの...
-
std::set<int> で、ある値が何...
-
C++にてtemplateで受け取った任...
-
int main()の・・・
-
ArduinoでMouse関数を使用して...
-
複数桁10進数の*桁目だけを抽出...
-
Enterキーを押されたら次の処理...
-
scanf が無視されます
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語でのfscanfについて
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
fgets( ) の返り値は何?
-
テキストファイル内に対して, ...
-
ファイルへの書込み処理が異常...
-
C言語にてXMLファイルから任意...
-
ファイル出力で改行を入れたい!
-
C言語でセグメンテーションエ...
-
エラーがわかりません、、
-
ガンマ変換 C言語でプログラ...
-
自己相関関数を求めるプログラ...
-
同時にファイル読み込み 書き込み
-
VisualStudioでのファイルの入...
-
c言語 ファイルから数字を読み...
-
大量の入力ファイルを扱うとき...
-
ファイルが読み込めない・・・
-
【C言語】ファイルを読み込んで...
-
構造体のメンバにファイルポイ...
おすすめ情報