以下のプログラムはカレントディレクトリ内の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が見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字化けって英語で・・・? 

仕事で外国からのメールを受ける事がしばしばありますが、
時々名前などが文字化けしているメールを受け取ります。
本文は英語で書いてくれているのでいわんとすることは分かるのですが、
文字化けでお名前がわからないということなどを相手に伝えたいときは
英語ではどのように表現するればよいでしょうか?
また、文字化けとは英語でどういうのでしょうか?

Aベストアンサー

文字化けそのものを知っている相手(1 バイト文字の国の人)には "The page turned into garbage." と言いました。うちの会社だけだったかもしれませんが (^^;;
aqua さんが書かれているように、相手も 2 バイト文字の国の人でしたら、"Japanese fonts don't support the characters at the bottom of your e-mail. Would you mind writing it in English?" など、「日本語のフォントでは対応していない文字です。」と伝えてはいかがでしょうか。

QC#でカレントディレクトリ以下のディレクトリを検索方法

C#でカレント以下のディレクトリ内のファイルを抽出して、リストボックスに表示させるプログラムを書きたいのですが、良いサンプルはありますか?

VBからの転向で構文を理解していないので、これを雛形にしてC#を覚えていきたいです。

Aベストアンサー

(良いかどうかは知りませんが)サンプルを作ってみました。
このまま動かせるように作ってあります。
例えば、filesList.cs という名前で保存したら
コマンドプロンプトで
csc filesList.cs
filesList
でコンパイル・実行できます。
カレントディレクトリ内のディレクトリについては、
FileSystemInfo[] dirs = di.GetDirectories();
foreach (DirectoryInfo diNext in dirs) {
//ここでそれぞれのディレクトリの処理をする
}
みたいな感じでやればいいと思います。
再帰的に処理するといいでしょう。
VBでできてたんだったら、これぐらいの説明でいいかと思いました。
分からない部分は、補足要求して下さい。
----------------------------------------------------------------
using System;
using System.IO;
using System.Windows.Forms ;
using System.Drawing ;
using System.Collections ;

namespace Bluepixy {
public class FilesListBox : Form {
private ListBox ListBox1 = new ListBox();

[STAThread]
static void Main(){
Application.Run(new FilesListBox()) ;
}

public FilesListBox(){
this.AutoScaleBaseSize = new Size(5, 13) ;
this.ClientSize = new Size(292, 300) ;
this.Text = "File List on ListBox" ;

ListBox1.Location = new Point(24, 16) ;
ListBox1.Name = "ListBox1" ;
ListBox1.Size = new Size(232, 130) ;

this.Controls.AddRange(new Control[] {ListBox1}) ;

DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory);//カレントディレクトリ
FileInfo[] fi = di.GetFiles();
foreach (FileInfo fiTemp in fi)
ListBox1.Items.Add(fiTemp.Name);
}
private void InitializeComponent()
{

}
}
}

(良いかどうかは知りませんが)サンプルを作ってみました。
このまま動かせるように作ってあります。
例えば、filesList.cs という名前で保存したら
コマンドプロンプトで
csc filesList.cs
filesList
でコンパイル・実行できます。
カレントディレクトリ内のディレクトリについては、
FileSystemInfo[] dirs = di.GetDirectories();
foreach (DirectoryInfo diNext in dirs) {
//ここでそれぞれのディレクトリの処理をする
}
みたいな感じでやればいいと思います。
再帰的に処理するといいでし...続きを読む

Q海外からの中国語や英語のメールやSMSを文字化けなしに受信するには

海外からの中国語や英語のメールやSMSを文字化けなしに受信するには

海外から発信される中国語や英語のメールやSMSを受け取る場合、文字化けせずに受け取るにはどうすればよいでしょうか。

文字化けは携帯電話の機種によって、異なりますか?また、海外からのメールやSMS発信の場合、どんなフォントやシステムを使えば、日本の携帯に文字化けなしに送れますか。

また、海外のPCや携帯から日本語で送信されたメールが、携帯に届くと、日本語の文章なのに、文字化けしていることがあります。この問題を解決するには、相手にどんなフォントやシステムを使って文章を書いてもらえばいいでしょうか。

おわかりになる点がひとつでもありましたら、教えて下さい。お願いします。

Aベストアンサー

中国語で作成された物はともかくとして
相当変った環境でない限り
英語で作成された物が文字化けするとは思えません
(ですので以下の話は中国語限定)

文字化けする際は使っている機種によって違うでしょう
中国語が表示されない機種(フォントがない機種)に
中国語で送っているわけですから

>海外のPCや携帯から日本語で送信されたメールが
>携帯に届くと、日本語の文章なのに、文字化けしていることがあります。
>この問題を解決するには、相手にどんなフォントやシステムを使って文章を書いてもらえばいいでしょうか。
これは途中のサーバ経路で日本語対応などしていないと化ける可能性があります
その場合どうしようもありません

日本語で書いていてもメールのエンコード設定や使用している
フォントによっては化けることがあります

文字化けの理由については幅が広いのでメールヘッダ見たり中継サーバ
確認したりしないと一概に  これが原因  ということはいえません

Qカレントディレクトリ内のファイルを配列に読むには?

カレントディレクトリ内のファイルの中で指定した拡張子のファイルを全て配列に読み込ませるプログラムを書こうと頑張っています。

しかし、方針がわからず困っています。
方針だけでも良いので教えていただけないでしょうか?

よろしくお願いいたします。

Aベストアンサー

質問する時には、開発&実行環境と、何がわからないのか具体的に記載して下さい。
方針とは何でしょう?
C言語においての配列などの考え方が解らないのか、ディレクトリを取得する方法がわからないのでしょうか?

理論だけ簡単に記載すると…
ディレクトリとは、ファイル目次が書かれた特殊なファイルです。
目的のディレクトリファイルから、ファイル名を読み出して、メモリに格納すれば良いです。
MacやLinuxなら、opendir, readdir この辺の関数で読み出せます。
Winなら、FindFirstFileEx, FindNextFile この辺の関数で読み出せます。
配列に取り込む場合、Winの場合はショートなのかロングなのか、Mac/LinuxならUTFの扱い、など考慮して設計して下さい。

Q英語サイトの文字化けで困ってます

Macで英語のサイトを見ると文字化けすることがあって困っています。
何か重要なフォントを消してしまったのでしょうか?

例えば英語のウィキペディアのサイトが文字化けします。
http://en.wikipedia.org/wiki/Main_Page
しかし英語のヤフーは文字化けしてません。
http://m.www.yahoo.com/

Fierfox、Safariどちらで見ても同じことがおこります。
Mac 10.4.11です。

よろしくお願いいたします。

Aベストアンサー

#2です。
解決してよかったですね。

>FontBookでHelvetica.dfontが最優先に使われるように設定するにはどうしたらよいのでしょうか?
この方法は、Font BookでHelveticaの項目に表示される「Helvetica.dfont」以外のフォントを無効にします。
Font Bookを起動し、「フォント」列の中からHelveticaを選択し、右向きの三角形をクリックして内容を表示します。
フォント名の右側に何も印が付いていないものが現在使われているフォントです。そのフォントを選択し、右クリックして、使用停止を選択すれば、そのフォントが無効になります。フォントメニューから「フォント情報を表示」を選択すると、そのフォントのファイル名などが表示されますので、どこにインストールされているフォントなのかを確認して作業してください。

しかし、、
そうすると、Illustratorなどでは、他のフォントを使用できなくなり、いちいちフォントの有効、無効を切り替える必要が生じます。さきほどは、何が原因かを探るために、この方法を紹介しましたが、現実的ではありません。ですので、別の方法を考えたほうがいいかと思います。

Illustratorなど、アドビシステムズ社のソフトウェアだけで使用するフォントでしたら、お勧めとしては、
HD>ライブラリ>Application Support>Adobe>Fontsフォルダの中に使用したい他のヘルベチカ系フォントを入れてください。
そうすれば、Illustratorなど、アドビシステムズ社のソフトウェアでだけ、他のヘルベチカ系フォントが使用できるようになります。

もう1つの方法は、置き換わっているフォントを特定し、そのフォントを使用しないようにする方法です。
元の状態(文字化けしている状態)に、フォントを戻します。
文字化けしているページに移動し、文字化けしている部分の文字を数文字コピーします。
テキストエディットなどにコピーし、そのフォントが何であるかを特定します。
特定したら、そのフォントだけ、フォントブックで無効にします。
再度、文字化けしているページを表示し、まだ文字化けしているようなら、また同じ作業を繰り返します。

#2です。
解決してよかったですね。

>FontBookでHelvetica.dfontが最優先に使われるように設定するにはどうしたらよいのでしょうか?
この方法は、Font BookでHelveticaの項目に表示される「Helvetica.dfont」以外のフォントを無効にします。
Font Bookを起動し、「フォント」列の中からHelveticaを選択し、右向きの三角形をクリックして内容を表示します。
フォント名の右側に何も印が付いていないものが現在使われているフォントです。そのフォントを選択し、右クリックして、使用停止を選択すれば、そ...続きを読む

QC# FTPサーバ カレントディレクトリのパス取得

C# .NETでFTP送信するツールを作成しているのですが、FTPサーバーのカレントディレクトリのパスが取得できません。

ftp://IPアドレスで接続して、WebRequestMethods.Ftp.PrintWorkingDirectoryを使用して色々試してみましたが書き方が悪いせいかPWDとしか返ってきません。

詳しい方ご教授宜しくお願い致します。

Aベストアンサー

'コード

using System;
using System.Net;
using System.IO;
using System.Text;

namespace Q6728181
{
class MainClass
{
public static void Main (string[] args)
{
FtpWebRequest fwb = (FtpWebRequest)WebRequest.Create("ftp://localhost/");
fwb.Credentials = new NetworkCredential("himajin100000","aaaa");
fwb.Method = WebRequestMethods.Ftp.PrintWorkingDirectory;
// Stream側に入ってはいないらしい。
System.Console.WriteLine(((FtpWebResponse)fwb.GetResponse()).StatusDescription);
}
}
}

//結果:
//257 "/" is current directory

//ちなみにLISTの場合は、
//StreamReader.ReadLineでそのディレクトリ内にあったもの、すなわち
//abc
//efg
//が表示された。

//検証環境 BlackJumboDog(C#製各種サーバ,FTPサーバのユーザーを登録後、ACLで「禁止する」を選択し、中身をそのまま空に),FileZilla(検証用), 自分で書いた上記のコード)

'コード

using System;
using System.Net;
using System.IO;
using System.Text;

namespace Q6728181
{
class MainClass
{
public static void Main (string[] args)
{
FtpWebRequest fwb = (FtpWebRequest)WebRequest.Create("ftp://localhost/");
fwb.Credentials = new NetworkCredential("himajin100000","aaaa");
fwb.Method = WebRequestMethods.Ftp.PrintWorkingDirectory;
// Stream側に入ってはいないらしい。
System.Console.WriteLine(((FtpWebResponse)fwb.GetResponse()).StatusDescription);
}
}...続きを読む

Q自作の英語版ホームページが文字化け

自作の英語版ホームページが文字化けしていないかどうか
確認するために、ブラウザで「表示」→「エンコード」を
変更して見たところ、「自動選択」では全く問題がなかったのですが、「西ヨーロッパ言語」(Windows)では、若干文字化けしていました。
英語版の場合、英語圏で文字化けすることなく見ることができれば良いと思うのですが、ブラウザで確認する場合は
エンコードを何に変更して見るのが最も適当でしょうか。

Aベストアンサー

英語圏では一般的にISO8859-1が標準的に使用されているようです。METAタグには以下のように記述します。
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

METAタグで記述しておけばブラウザでエンコードを切り替えなくても自動的に判別してくれます。
文字化けしやすい例としては全角のスペースですね。
多国語に対応したエンコードとしてはUTFがあります。

QVC++ Win32アプリ ディレクトリ内のディレクトリ名取得

こんにちは。
VC++のWin32アプリケーションでディレクトリ内の
ディレクトリ名を全部取得しようとしていますが
良い方法がみあたりません。
どなたかお分かりになる方、おしえてください。
よろしくお願いします。

Aベストアンサー

FindFirstFile
FindNextFile
を使って、

構造体WIN32_FIND_DATAの中の
dwFileAttributesをみてディレクトリかどうかを判定すれば
良いのでは?

Q「文字化け」を英語で…。

ある海外の方と知り合い、文通をする事になりました。
相手の方が住所を教えて下さったのですが、
そこだけ文字化けしていたので読めませんでした。

「文字化けしているのでもう一度メールを送ってくれませんか?」
と言いたいのですが、『文字化け』は英語で何と言うのでしょうか?

Aベストアンサー

文字化けはfunny characters // garbled characters です。

下記の文章で伝わるかと思います。
I got a garbled e-mail from you. Could you e-mail me again?

QC#でカレントディレクトリの取得方法について

 自作の.exeファイルの置かれているディレクトリ場所を
 取得するプログラムを作成したく思います・

 自作exeファイルのディレクトリ構造は、「*:*/hoge/plugin/自作.exe」です。
 この時、一個上のディレクトリを参照して、ディレクトリパスを取得する
 方法などがありましたらおしえて頂きたく思います。

 ちなみに、以下のプログラムではできなかったのですが、参考までに載せました。

 よろしくお願いします。

 string stParentName = System.IO.Path.GetDirectoryName(@"*:*/hoge/plugin/自作.exe");
MessageBox.Show(stParentName);

Aベストアンサー

こんばんは



>一個上のディレクトリを参照して、ディレクトリパスを取得する
*:*/hoge/pluginを取得することでしょうか?



上記の仮定ですと

System.IO.FileInfo ofile = new System.IO.FileInfo(@"*:*/hoge/plugin/自作.exe");
string stParentName = ofile.DirectoryName;
MessageBox.Show(stParentName);


このような感じでしょうか?


人気Q&Aランキング

おすすめ情報