以下のプログラムはカレントディレクトリ内のCSVファイルの一覧を取得するプログラムを書いています。main関数内のprintfでファイル一覧を表記させたいと考えています。

カレントディレクトリに4つのCSVファイルあったとします。
1.csv
2.csv
3.csv
4.csvとします。

foo関数で
a[0]=1.csv
a[1]=2.csv
a[2]=3.csv
a[3]=4.csvと格納されたとします。
ですが、main関数内のprintfでは
a[0]=4.csv
a[1]=4.csv
a[2]=4.csv
a[3]=4.csv
として表記されてしまいます。
main関数内で
a[0]=1.csv
a[1]=2.csv
a[2]=3.csv
a[3]=4.csv
として表記するにはどうしたらいいのでしょうか?
また、foo関数内でのprintfを行わないとmain関数内での表記が添付画像のように文字化けしますこの理由はなぜでしょうか?
もしわかるかたがいましたら教えていただけないでしょうか?
よろしくお願いします。

ここから記述したプログラムです。デバックすれば動きます。

#include <stdio.h>
#include <windows.h>
#include <string>
#include<conio.h>

using namespace std;
char *a[10];
long n;

void foo( int cnt, const string dirname )
{
WIN32_FIND_DATA fd;
HANDLE h;


// ハンドルを取得する
h = FindFirstFileEx(
( dirname + "*.csv" ).c_str(),
FindExInfoStandard, &fd,
FindExSearchNameMatch,
NULL,
0
);
if ( INVALID_HANDLE_VALUE == h ) {
printf( "ディレクトリ %s でエラー\n", dirname.c_str() );
return ;
}
n=0;

do {
printf( "%s\n", fd.cFileName );
a[n]=fd.cFileName;
//printf("%s\n", a[n]);
n=n+1;
// 次のファイルを検索する
} while ( FindNextFile( h, &fd ) );
// ハンドルを閉じる
FindClose( h );
}

int main()
{
foo( 0, ".\\" );
for(n=0; n<4; n++)
{
printf("%s\n", a[1]);
}
getch();
return 0;
}

「プログラムの間違いについて」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (7件)

変数の宣言


char *a[10];

char a[10][50];
に(50は適当です)
ファイル名のコピー
a[n]=fd.cFileName;

_tcscpy(a[n], fd.cFileName);
にすれば多分OKです
(C++は詳しく無いので_tcscpyは間違ってるかも)

fd.cFileName文字列ポインタです
a[n]=fd.cFileNameではポインタしか保存していません
FindNextFile( h, &fd )で次のファイル名を探して、同じアドレスにファイル名を上書きする為、ポインタを保存しただけでは、最後に見つけたファイル名が表示されます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

a[n]=fd.cFileName;

_tcscpy(a[n], fd.cFileName);
にしたのですが、エラーが出てしまいました。

お礼日時:2011/04/24 17:36

> 一つ疑問なのですが、どうして文字化けも発生しなくなったんでしょうか?



コピー領域が不正だったんだから何が起こっても不思議じゃない。
ちゃんと領域確保したんだからちゃんと動くでしょうよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。わかりました。

お礼日時:2011/04/24 19:59

> _tcscpy(a[n], fd.cFileName);


> にしたのですが、エラーが出てしまいました。

それに先立ち領域を確保した?
    • good
    • 0
この回答へのお礼

ありがとうございます。
領域確保でうまくいきました。(忘れてました。本当にありがとうございます。)

あと、文字化けも発生してません。一つ疑問なのですが、どうして文字化けも発生しなくなったんでしょうか?
もし可能でしたら教えていただけないでしょうか?

お礼日時:2011/04/24 18:27

WIN32_FIND_DATAのcFileNameって、固定領域みたいなので、コピーする必要がありそう。



デバッガでcFileNameのアドレスがループごとに変化するか(あるいはしないか)をウォッチしてみては。
    • good
    • 0
この回答へのお礼

ありがとうございます。検討してみます。

お礼日時:2011/04/24 17:36

do {


printf( "%s\n", fd.cFileName );
a[n]=fd.cFileName;
//printf("%s\n", a[n]);

コメントアウトなさってますが、この時点で a[n] は正しく表示できましたか?
そもそも、fd.cFileName は正しく取得できましたか?
    • good
    • 0
この回答へのお礼

はい。そこはprintfで表記されました

お礼日時:2011/04/24 16:56

int main()


{
foo( 0, ".\\" );
for(n=0; n<4; n++)
{
printf("%s\n", a[1]);
}
getch();
return 0;
}


forループの添え字が n であるのに、printf("%s\n", a[1])は 1 固定ですが?
    • good
    • 0
この回答へのお礼

すみません。ご指摘ありがとうございます。
色々試していたので間違ってしまいました。

#include <stdio.h>
#include <windows.h>
#include <string>
#include<conio.h>

using namespace std;
char *a[10];
long n;

void foo( int cnt, const string dirname )
{
WIN32_FIND_DATA fd;
HANDLE h;


// ハンドルを取得する
h = FindFirstFileEx(
( dirname + "*.csv" ).c_str(),
FindExInfoStandard, &fd,
FindExSearchNameMatch,
NULL,
0
);
if ( INVALID_HANDLE_VALUE == h ) {
printf( "ディレクトリ %s でエラー\n", dirname.c_str() );
return ;
}
n=0;

do {
printf( "%s\n", fd.cFileName );
a[n]=fd.cFileName;
//printf("%s\n", a[n]);
n=n+1;
// 次のファイルを検索する
} while ( FindNextFile( h, &fd ) );
// ハンドルを閉じる
FindClose( h );
}

int main()
{
foo( 0, ".\\" );
for(n=0; n<4; n++)
{
printf("%s\n", a[n]);
}
getch();
return 0;
}

の間違いです。上記のプログラムでもうまくいきません。
どうしてでしょうか?

お礼日時:2011/04/24 16:16

main の中で



printf("%s\n", a[1]);

になってます

printf("%s\n", a[n]);

では?
    • good
    • 0
この回答へのお礼

すみません。ご指摘ありがとうございます。
色々試していたので間違ってしまいました。

#include <stdio.h>
#include <windows.h>
#include <string>
#include<conio.h>

using namespace std;
char *a[10];
long n;

void foo( int cnt, const string dirname )
{
WIN32_FIND_DATA fd;
HANDLE h;


// ハンドルを取得する
h = FindFirstFileEx(
( dirname + "*.csv" ).c_str(),
FindExInfoStandard, &fd,
FindExSearchNameMatch,
NULL,
0
);
if ( INVALID_HANDLE_VALUE == h ) {
printf( "ディレクトリ %s でエラー\n", dirname.c_str() );
return ;
}
n=0;

do {
printf( "%s\n", fd.cFileName );
a[n]=fd.cFileName;
//printf("%s\n", a[n]);
n=n+1;
// 次のファイルを検索する
} while ( FindNextFile( h, &fd ) );
// ハンドルを閉じる
FindClose( h );
}

int main()
{
foo( 0, ".\\" );
for(n=0; n<4; n++)
{
printf("%s\n", a[n]);
}
getch();
return 0;
}

の間違いです。上記のプログラムでもうまくいきません。
どうしてでしょうか?

お礼日時:2011/04/24 16:16

このQ&Aに関連する人気のQ&A

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


人気Q&Aランキング