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

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

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

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

A 回答 (2件)

質問する時には、開発&実行環境と、何がわからないのか具体的に記載して下さい。


方針とは何でしょう?
C言語においての配列などの考え方が解らないのか、ディレクトリを取得する方法がわからないのでしょうか?

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

この回答への補足

ありがとうございます。無事書くことができました。

補足日時:2011/04/24 01:58
    • good
    • 0
この回答へのお礼

ありがとうございます。初めて耳にする関数なので参考にさせていただきます。

作業環境は
osがwindowsで、visualstudioでコンパイルしています。

特にディレクトリを取得する方法がわかっていません。

よろしくお願いします。

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

http://q.hatena.ne.jp/1118121349
が参考になるのでは?
printfの代わりに配列に入力するとか。
    • good
    • 0
この回答へのお礼

ありがとうございます。

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>

int main( int argc, char *argv[] )
{
char *dir;
DIR *dp;
struct dirent *entry;
struct stat statbuf;

if(argc<2){
dir = getenv("PWD");
}else{
dir = argv[1];
}

if(( dp = opendir(dir) ) == NULL ){
perror("opendir");
exit( EXIT_FAILURE );
}

while((entry = readdir(dp)) != NULL){
stat(entry->d_name, &statbuf);
if(S_ISDIR(statbuf.st_mode)){
fprintf(stdout, "%s/\n", entry->d_name);
}else{
fprintf(stdout, "%s\n", entry->d_name);
}
}

closedir(dp);

return(0);
}

参考サイトを参考にこちらのプログラムを見つけ、コンパイルしました。しかし、dirent.hがincludeできませんでした。問題は何かあるのでしょうか?

作業環境は
osがwindowsで、visualstudioでコンパイルしています。

お礼日時:2011/04/24 01:02

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

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

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

QC言語で、他の関数で配列を書き換えられないようにしたい

下のCのプログラムでは、func関数は配列aの先頭要素へのポインタを返します。

main関数の側では配列aの中身を表示します。
しかし、main関数のfor文の中の★の部分をコメントアウトせずに入れると、この配列の中身が書き換わってしまいます。
 私はfunc関数以外では、この配列の中身をいじられたくないのです。
 なんとかfunc関数を工夫して作成して、func関数以外では、配列の中身が変わらないようにしたいのですが、どうすればよいでしょうか。
 
 とは言ったものの、多分できないだろうなあ、という気がします。
 できないならばできないでも仕方ないのですが、確信が持てないのです。

条件があります。
funcでは表示は行なわない。
配列aの中身を表示できるように、funcから呼び出し元へ、aのアドレスまたはaの先頭要素のアドレスがわかるような情報を返す。


#include <stdio.h>

char *func(int i)
{
static char a[]="AAAA";
a[i]='z';
return a;
}

int main(void)
{
int i;
for(i=0; i<4; i++)
{
char *p=func(i);
/* p[i]='X'; ★配列の中身を書き換えてしまう。 */
puts(p);
}
return 0;
}

下のCのプログラムでは、func関数は配列aの先頭要素へのポインタを返します。

main関数の側では配列aの中身を表示します。
しかし、main関数のfor文の中の★の部分をコメントアウトせずに入れると、この配列の中身が書き換わってしまいます。
 私はfunc関数以外では、この配列の中身をいじられたくないのです。
 なんとかfunc関数を工夫して作成して、func関数以外では、配列の中身が変わらないようにしたいのですが、どうすればよいでしょうか。
 
 とは言ったものの、多分できないだろうなあ、とい...続きを読む

Aベストアンサー

staticな変数を使う限りは無理な話です。

func内でnon-staticな領域にコピーしたものをreturnする。
仕様を明記し,funcを呼び出した先で別のバッファへコピーして使うよう徹底する。

などの対策をするしかないでしょう。
こういう仕様では,逆にfunc関数以外で使っていた文字列の内容が funcの呼び出しによって意図せず書き換えられてしまう,といった逆のパターンも往々にしてあります。要注意。

Qフォントをカレントディレクトリから読み込む方法

win32アプリケーションを作成しています。
フォントを、WINDOWS\Fontsからではなく、そのアプリケーションがあるディレクトリから読み込む必要が出てきたので、
hFont = CreateFont(iHeight,0,0,0,FW_DONTCARE, FALSE, FALSE, FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,"MS ゴシック");
を最後の引数だけ変更して、
hFont = CreateFont(iHeight,0,0,0,FW_DONTCARE, FALSE, FALSE, FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,"./hoge.ttf");
のようにしたのですが、読み込めていないようです。
MSDNを見ると、最後の引数はフォント名だとなっているので
hFont = CreateFont(iHeight,0,0,0,FW_DONTCARE, FALSE, FALSE, FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,"hoge");
としましたが、やはりうまく行きません。
どのようにすれば、カレントディレクトリのフォントを使用できるのか、わかる方、ご教授お願いします。
環境はvc 2005, XPです。

win32アプリケーションを作成しています。
フォントを、WINDOWS\Fontsからではなく、そのアプリケーションがあるディレクトリから読み込む必要が出てきたので、
hFont = CreateFont(iHeight,0,0,0,FW_DONTCARE, FALSE, FALSE, FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,"MS ゴシック");
を最後の引数だけ変更して、
hFont = CreateFont(iHeight,0,0,0,FW_DONTCARE, FALSE, FALSE, FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAUL...続きを読む

Aベストアンサー

CreateFontなどで直接フォントファイルを指定するのは無理だと思います
CreateFontの最後の引数は FontFaceなので『MS 明朝』『MS ゴシック』などのフォント名になります
フォント選択ダイアログに表示される名前です … ファイル名ではありません
簡単にやるなら AddFontResouceなどでそのフォントをWindowsに登録してからCreateFontなどを使うようにしましょう
アプリケーションの終了時に RemoveFontResourceを実行する必要があるのでしたら適当なタイミングで実行するようにしましょう

Qエクセルの配列関数の制限について

エクセルの配列関数の制限について


V列にX列・Y列・Z列・AA列・AB列・AC列・AE列・AG列・P列を参照した配列関数を
下のように入力しています。

{=SUM((Y$1:Y$500=F7)*(Z$1:Z$500=H7)*(AA$1:AA$500)*(P7="○"),(AB$1:AB$500=F7)
*(AC$1:AC$500=H7)*(AE$1:AE$500=H7)*(AG$1:AG$500)*(P7="×"))}

このY列・Z列・AA列・AB列・AC列・AE列・AG列は、ぞれぞれ200行くらいしか
文字が入力されていない場合には、配列関数の結果がうまく表示されました。


これらのセルの200行以降から300行・400行と項目を増やしていったところ、
配列関数の結果がうまく表示されないセルが出てきました。


これは、配列関数の参照するセルに制限があるということでしょうか?

Aベストアンサー

>SUMPRODUCT関数でも同様に0が表示されました。

F9キーで再計算しても「0」と表示されるなら、集計対象のセルがないということです。

>配列数式の結果で0が表示された件について、Y列・Z列の文字に半角と全角の括弧
「()」と「()」が混在していたことが原因と判明しました!

この意味が不明ですが(仮に混在しているとしても「0」と表示されることはない)、今回の「0」が表示される原因は解明できたということでしょうか?

>再計算されるまでに10分~15分かかり、メールやインターネットや他のエクセルなどが
使用できずに固まってしまいます。そのため、手動で再計算されるようにして何とか
使用しています。

再計算に1分以上かかることはほとんど考えられないのですが、いずれにしろ今回のようなデータ範囲の広い配列数式を多数入力するのは全く実用に堪えないと思いますので、数式部分を適宜「値」化して(古いデータを修正する場合は必要に応じて計算式を少しずつオートフィルする)、必要最小限の数式だけを残して作業することをお勧めします(VBAを使用しても計算に時間がかかる可能性が高いと思います)。

>SUMPRODUCT関数でも同様に0が表示されました。

F9キーで再計算しても「0」と表示されるなら、集計対象のセルがないということです。

>配列数式の結果で0が表示された件について、Y列・Z列の文字に半角と全角の括弧
「()」と「()」が混在していたことが原因と判明しました!

この意味が不明ですが(仮に混在しているとしても「0」と表示されることはない)、今回の「0」が表示される原因は解明できたということでしょうか?

>再計算されるまでに10分~15分かかり、メールやインターネットや他のエク...続きを読む

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関数へのポインタ渡しでの配列の初期化について

はじめまして、C言語の基本的な質問をさせてください。

C言語で、外部関数へポインタで引数を渡す場合に、
関数に渡されるのはアドレスですよね?

で、渡された関数側でそのポインタの配列の初期化を
するときにはアドレスだけの情報だと、要素数がいくつ
あるか分からず、領域の破壊をしてしまいそうな気が
するのですが?いかがでしょうか?

また、関数かなんかで、配列の要素数が分かる関数が
あったような気がするのですが、それもアドレスだけ
でわかるのでしょうか?

Aベストアンサー

疑問に思っていらっしゃる通りです。

渡された関数側では、要素数がいくつあるかわかりません。
初期化をするならば、ポインタと一緒に、要素数の情報も渡してやる必要があります。

配列の要素数がわかる関数はありません。
マクロ(プリプロセッサ)で、配列要素数を計算するのは可能ですが、
これは使用場所が限定されています。
配列を宣言したすぐ近くでないと役に立ちません。
渡された関数側では使えません。

C言語では、配列はその要素数とともに扱う必要があり、
そこをうっかりするとバグが発生する危険があります。

Q配列内の文字列を読み込む方法

C++言語において質問です。あまり詳しくないので、変な質問でしたらすみません。
配列の文字列内にスペースが有る場合とない場合で表示を分けるものを作りたいと
思っています。
以下のようなものを書いた所、動くけど『iがいらない』、『メモリリークしている』
という風に言われました。自分でも調べてみたのですが、2つの事を解決できません。
どのようにすればよいのか、お教え願えませんか。
又、この場合のメモリリークとはどういう意味なのでしょうか?


#include <stdio.h>
#include <string.h>
#include <ctype.h>

char* name_list[] = {"", "AAA A", "BBBB", 0};

void main(){
int i = 1;
char *b=0;
for(char** a = &name_list[1]; *a != 0; a++, i++){
for(char* p = *a; *p != '\0' && !isspace((unsigned char)*p); p++)
;
if(*p != '\0'){
b = new char[strlen(name_list[i]) + 3];
sprintf(b, "space %s", name_list[i]);
} else {
b = new char[strlen(name_list[i]) + 1];
strcpy(b, name_list[i]);
}
fprintf(stderr, "%s\n", b);
}
return;
}

C++言語において質問です。あまり詳しくないので、変な質問でしたらすみません。
配列の文字列内にスペースが有る場合とない場合で表示を分けるものを作りたいと
思っています。
以下のようなものを書いた所、動くけど『iがいらない』、『メモリリークしている』
という風に言われました。自分でも調べてみたのですが、2つの事を解決できません。
どのようにすればよいのか、お教え願えませんか。
又、この場合のメモリリークとはどういう意味なのでしょうか?


#include <stdio.h>
#include <string....続きを読む

Aベストアンサー

/*動くように修正しました、参考にでもしてください */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char* name_list[] = {"", "AAA A", "BBBB", 0};

void main(){
int i = 1;
char *b=0;
for(char* a = name_list[1]; /* name_listの要素は char* です */
a != 0; i++, a = name_list[i]){
char *p;
for(p = a;/* ポインターの扱いかたが間違っていました */
*p != '\0' && !isspace((unsigned char)*p); p++)
;
if(*p != '\0'){/* スコープ外でpを使用していたため宣言を移動しました */
b = new char[strlen(name_list[i]) + 3];
if (b == (char *)NULL) { /* エラー判断も入れましょう、大規模プログラムになると必要です */
printf("malloc error \n");
break;
}
sprintf(b, "space %s", name_list[i]);
} else {
b = new char[strlen(name_list[i]) + 1];
if (b == (char *)NULL) {
printf("malloc error \n");
break;
}
strcpy(b, name_list[i]);
}
fprintf(stderr, "%s\n", b);
free(b);/* これも必要です */
}
}

/*動くように修正しました、参考にでもしてください */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char* name_list[] = {"", "AAA A", "BBBB", 0};

void main(){
int i = 1;
char *b=0;
for(char* a = name_list[1]; /* name_listの要素は char* です */
a != 0; i++, a = name_list[i]){
char *p;
for(p = a;/* ポインターの扱いかたが間違っていました */
*p != '\0' && !isspace((unsigned char)*p); p++)
;
if(*p != '\0'){/* スコープ外...続きを読む

Q関数を使った配列計算

関数を用いて配列を使った行列の演算(入力された行列の行列式、転置行列、逆行列)をするプログラムを見やすくしたいのですが、配列を関数に渡すやり方がわかりません。


出来れば実際のプログラムで教えてもらいたいです。よろしくお願いします。

Aベストアンサー

C言語の場合ですが、

void test(int a[10])
{
a[0] = 10;
}

int main(void)
{
int a[10];

test(a);
}

↑このような記述で配列を関数に渡すことが出来ます。
関数test内で書き換えた配列はmainでも反映されてます。

QC言語でコマンドラインのカレントディレクトリの移動

C言語でコマンドラインのカレントディレクトリを移動するということは可能でしょうか?


ちなみに、
system("cd C:\\");

としてみても、ルートディレクトリに移動したりはしてくれませんでした。

Aベストアンサー

ひょっとして作ろうとしているプログラムは、それをコマンドプロンプトから実行すると
カレントディレクトリを変更する
(そして実行終了する)。といった動作をするものでしょうか?

だとしたら、それはできません。

Q配列を書き換える関数を作成してみたいのですが、

配列を書き換える関数を作成してみたいのですが、

int a[10]={3,5,7,6,7,8,10,2,3,11};

上記のような配列があるとして、
0~9のうち特定の添字を指定して、a[]の中身を書き換える関数を作る場合は、
どのような方法があるのでしょうか?

Aベストアンサー

#4 訂正
>ネストを似やすくするため全角スペースを入力しています
ネストを見やすくするため全角スペースを入力しています

どうせなので
多分間違いだとは思いますが#3さんのは
>change(a, a, 2);
change(a, 1, 2); の打ち間違いだと思われます

更に思いつき#1さんのをちょっと書き方変えてみました
>void change(int a[],int i,int n){
>a[i]=n;
>}

コール側
change(a, 1, 2);    //a[1] に2を代入する
関数側
void change(int *addr, int pt, int newdata){
  *(addr+pt) = newdata;
}

もありかな(同じくコンパイルなどはしてません)

QLinuxのchdir(カレントディレクトリが移動できない)

環境はLinuxおよびcygwinです。

chdir()関数でカレントディレクトリを移動するプログラムを作成しようとしていますが、プログラムの実行後、「pwd」コマンドでカレントディレクトリを確認してもカレントディレクトリが移動されていません。

ソースコード(一部)

chdir("/home/hogehoge");

としても、カレントディレクトリは移動せず、pwdコマンドで、
/home/hogehoge
になりません。
chdir()関数はエラーを返していません。

もしくは、cdコマンドのソースコードが入手できれば、一番よいのですが・・・Linuxのカーネルやその他のソースコードを展開してもどこにあるか分かりません。

どなたかご教授お願いします。

Aベストアンサー

コマンドの種類(ビルトイン、alias、実行ファイル)は、bashの場合、type cd や type ls 等でわかります。man bash でマニュアルが出るのはご存知でしょうが、一度通読すると色々発見があるかと思います。

プログラムからカレントシェルのカレントディレクトリを変えるのは少しマジックを使うと不可能ではありません。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
main(int argc,char **argv)
{ pid_t pid_of_shell;
FILE *f;
f=fopen("/tmp/sourcefile","w");
fprintf(f,"cd %s\n",argv[1]);
fclose(f);
pid_of_shell=getppid();
kill(pid_of_shell,30);
}
必要最小限のコードなので実際には色々チェックしてください。
シェルの側では、事前に、
trap 'source /tmp/sourcefile' 30
というコマンドを実行しておきます。
上記プログラムをコンパイルして、mycd というコマンドを作り、
mycd ディレクトリ
で移動できます。
あくまで cd コマンドはカレントシェルに実行してもらわないといけません。そのため、固定のファイル名が要るのが難点ですね。/tmpじゃなくて$HOMEの下がいいかな。

コマンドの種類(ビルトイン、alias、実行ファイル)は、bashの場合、type cd や type ls 等でわかります。man bash でマニュアルが出るのはご存知でしょうが、一度通読すると色々発見があるかと思います。

プログラムからカレントシェルのカレントディレクトリを変えるのは少しマジックを使うと不可能ではありません。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
main(int argc,char **argv)
{ pid_t pid_of_shell;
FILE *f;
f=fopen("/tmp/sourcefile"...続きを読む


人気Q&Aランキング

おすすめ情報