• ベストアンサー

UNIX上でのファイルopenについて

C言語で同一ディレクトリから複数のファイルを順番に読み込んでいきたいのですが、うまくいきません。 シェルで、ファイル名の取得を行っていっています。 shell ---- ls /home/data > /home/src/infile.txt ---- C ----------------------------- FILE *fp; char y[30]="/home/data/"; // ↓aには上記シェルにて取得した1件目のファイル名が入っています。 strcat(y,a); // ↓ここでは絶対パスが正しく表示されます printf("ddd:%s\n",y); // ddd:/home/data/11.txt // ↓ここでfile open errorで一件目で終了してしまいます。 if ((fp = fopen(y,"r")) == NULL){ printf("file open error!!\n"); exit(1); } ----------------------------- このようなファイルの読込みのやり方ができるのか教えてください。 もしできるのであるのなら、そのやり方も教えてください。 わかりにくい文章ですが、お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは。  まず、aliasと打って、lsコマンドに余分な別名が付いていないか確認してください。付いている場合、\lsとして、aliasをパスします。"alias ls 'ls -F'"などとしてあると、*などの余分な文字がくっつきます。また、厳密には"\ls -1 >"とします。-1は、1カラムで表示するというオプションです。  次にyの配列数ですが、PATH_MAXという定数がありますので、こちらを使用してください。  それから数件表示/オープンするのであれば、strcatでyに連結すると、次のデータはどうなると思いますか?  オープンが失敗する理由ですが、viコマンドでそのファイルをオープンできますか?つまり、実行ユーザにリードのアクセス権がありますか?また、デバッガで止めて、確実に目的のファイルを指していることを確認してください。  最後に、「プログラミング言語C」第2版はお持ちでないですか? http://www.pro.or.jp/~fuji/computerbooks/c/c.kernighan.html お持ちでないなら、本屋に急行してください。C言語を作った人によるC言語の本で、「Cのバイブル」、「KR本」とも言われるものです。この中に、外部コマンドからファイル名をもらわなくても、ディレクトリの内容を再帰的に表示するプログラムの例があります。

dattyo
質問者

お礼

すばやい回答ありがとうございます。 C言語は一昨日より始めたばかりなので質問しました。 aliasについては問題なさそうです。 PATH_MAXの方は現在調べています。 オープン失敗の事ですが、プログラムで直接パスを送ると --------- if ((fp = fopen("home/data/11.txt","r")) == NULL) --------- 正しく内容が取得できるので、アクセス権に関しては問題ないと思います。 C言語の本は今日買いに走ろうと思ってます。

その他の回答 (5)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.6

こんにちわ。 shell の出力結果をC から拾うよりも、 opendir()/readdir() 等を使った方が楽ですょ。 その方が、移植性も高いし・・・。

参考URL:
http://h30097.www3.hp.com/docs/i18n/japan/Single_UNIX_Documentation/NCH0751X.HTM
dattyo
質問者

お礼

回答ありがとうございます。 別の方法でとりあえずは動きました。 opendirの使い方は後日勉強して挑戦してみたいと思います。 ありがとうございました。

  • nagare
  • ベストアンサー率33% (280/831)
回答No.5

"11.txt"なら 6 が正解ですよ

dattyo
質問者

お礼

改行コードが入ってました。 改行コードを変換して直りました。 ありがとうございました。

回答No.4

 「/home/data/11.txt」ですか、「home/data/11.txt」ですか?先頭にスラッシュがあるのとないのとでは、全然違うディレクトリをさしますよ? #レス不要 if ((fp = fopen("home/data/11.txt","r")) == NULL) --------- 正しく内容が取得できるので、アクセス権に関しては問題ないと思います。 ======================= char y[30]="/home/data/"; strcat(y,a); printf("ddd:%s\n",y); // ddd:/home/data/11.txt

  • nagare
  • ベストアンサー率33% (280/831)
回答No.3

予想なんですけど aが"11.txt"ではなく"11.txt   " という具合になっていないか確認してください あと strcat(y,a); は y[0]='\0'; strcat(y,"/home/data/"); strcat(y,a); のようにしないと ループさせたら、すんごいことになりますよ

dattyo
質問者

お礼

回答ありがとうございました。 aの部分ですが、strlenで見たところ、7になっているので問題はないと思います。 yの部分は直しました。 ありがとうございます。

  • onti
  • ベストアンサー率37% (9/24)
回答No.2

C言語のfopen()を使用して、エラーになっているので あれば、まず、errnoを確認してみてはどうですか? そうすれば、どういったエラーが発生しているかは 一目瞭然です、errno変数に、エラー番号が入っているので errno.hのファイルで該当する番号をみてみれば、エラー 番号の横にコメントでどういったエラーなのかかかれていると 思います。

dattyo
質問者

お礼

回答ありがとうございます。 ERRNOは2で、 /* No such file or directory */ でした。

関連するQ&A

  • C言語 教えてください

    data.txtの中に入っているデータを読み込み、 全て出力するというプログラムを作ろうとしています。 しかし、上手く読み込み表示させることが出来ません。 自分で出来るだけ調べたのですが、 どこがおかしいのかわからないので教えてください。 ↓↓↓現在作っているプログラムです↓↓↓ #include <stdio.h> void main(void) { FILE *fp; char number, name; if ((fp = fopen("data.txt", "r")) == NULL) { printf("FILE OPEN ERROR\n"); } else { while (fscanf(fp, "%s%s", number, name) == 2) { printf("%s-%s\n", number, name); } } fclose(fp); printf("FILE CLOSE !!\n"); } ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↓↓data.txt↓↓ 001 aaa 002 bbb 003 ccc 004 ddd 005 eee ↑↑↑↑↑↑↑↑ よろしくお願いします。

  • FILE オープンについて

    いつもお世話になります。 今ファイルデータ検索処理を検討しております。 今、search.txtには、 検索対象となるファイルパスが記載されています。 [search.txt] /home/hoge/SAMPLE1.jpg /home/hoge/SAMPLE2.jpg search.txtをfopen()し、1行ずつfgets()して、 得られるファイルパスより、そのファイルを fopen()して解析する処理がしたいですが、 fgets()より得られたファイルパスをfopen()し、 fread()するとセグメンテーションエラーになります。 どのようにしたらいいのでしょうか? 現状のコードを下記します。 FILE *fp; char *com1 = "/home/hoge/search.txt"; FILE *confp; char buf1[1024]; char buf2[1024]; int i =0; fp = fopen(com1, "r"); while( fgets(buf1, sizeof(buf1), fp )){ confp = fopen(buf1, "rb"); //*.JPGファイルをオープン //下記fread()でセグメンテーションエラー size_t size = fread( buf2, sizeof(char), 1024, confp ); for( i = 0; i<1024; i++ ){ if( (buf2[i] == 0xff) && (buf2[i+1] == 0xe0) ){ printf("%02x\n",buf[i+5]); } } } fclose(fp); fclose(confp); 上記のように、search.txtをfopen()し、読み込んだファイルパスを fopen()して、fread()読み込みをする方法を 教えて下さい。 どうぞよろしくお願い致します。

  • txtファイルが作成されない

     こんにちは。  C言語初心者で、C言語の勉強をしています。  Visual C++ 2005 Express Editionで、  下記のようなプログラミングをし、kus.txtファイルを   作成しようとしました。  #include <stdio.h> int main(void) { FILE *fp; fp = fopen("kus.txt", "w"); if(fp == NULL){ printf("ファイルオープン失敗\n"); return 1; } else{ printf("ファイルオープン成功\n"); } fclose(fp); printf("ファイル閉じる\n"); return 0; }  そしてこれをソリューションのリビルトをし、  エラー0、警告1とでて、無事にビルトできましたが、  この後コマンドプロンプトで、   このプログラムを実行したところ、  ファイルオープン成功  ファイル閉じる  という言葉はしっかりでてきたのですが、  肝心のkus.txtが、画面のどこにもでてきません。  なぜでしょうか。教えてください。  

  • バイナリファイルをテキストファイルに変換する方法を教えて頂けませんか。

    こんにちは。 バイナリファイルをテキストファイルのように読み込んだり、書き込んだりすることは可能でしょうか。バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教授頂きたいです。 以下は自分なりに考えたプログラムなのですが、すごく文字化けして出力されてしまいます。どこがいけないんでしょうか。 ####プログラム#### #include<stdio.h> int main(){ FILE *fp,*fp2; char str[1024]; //file.txtはバイナリファイルなのでバイナリモードで開く if((fp = fopen("file.txt","rb")) == NULL){ printf("file.txt:open error"); exit(-1); } //out.txtはテキストファイルとして保存したいのでテキストモードで開く if((fp2 = fopen("out.txt","at")) == NULL){ printf("out.txt:open error"); exit(-1); } //一行ずつバイナリファイルをテキストファイルにして保存 while((fgets(str,1024,fp)) != NULL){ printf("%s\n",str); fprintf(fp2,"%s\n",str); } fclose(fp); fclose(fp2); return 0; } ####ここまで#### 以下が出力されたテキストファイル(out.txt)です。 ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI&egrave;&Ccedil; ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI0g 酷い文字化けを起こしてしまっています。 解決方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。

  • ファイルがオープンできない

    現在コマンドライン引数を利用した、Drag&Dropで入力されたバイナリファイルをテキストファイルに出力するプログラムをCで作成しています。 その過程で、Drag&Dropされたファイル以外にもテキストファイル(option.txt)を読み込みたいのですが、どうしてもそのファイルをオープンすることができません。 次は問題の部分だけを抜き出したソースです。 #include <stdio.h> int main(int argc,char *argv[]) {  FILE *s;  s=fopen("option.txt","r");  if( !s ){   printf("Error: cannot open file(option.txt)\n");  }   else printf("OK!\n");  if(argc == 2) printf("%s\n",argv[1]);  else if(argc ==1) printf("No Drag&Drop File\n");  return 0; } Drag&Dropしない時(作成された実行ファイルをダブルクリックで起動する時)は  OK!  No Drag&Drop File となり、問題のoption.txtのファイルは開けているのですが、適当なバイナリファイル(7.chn)をDrag&Dropすると  Error: cannot open file(option.txt)  C:\Documents and Settings\[ユーザー名]\デスクトップ\Program\7.chn と、先ほどまで開けていたoption.txtのテキストファイルが急に開けなくなってしまいました。 どうにも原因・解決策が分かりませんでしたので、お聞きしたくこちらに書き込みをさせてもらいました。 どなたか分かる方いらっしゃいましたらよろしくお願いします。

  • C言語 iMacでのファイル入出力

    #include <stdio.h> int main() { FILE *fp; fp=fopen("test.txt","w"); if (fp==NULL){ perror("ファイル・オープンに失敗しました\n"); return -1; }else printf("ファイルを正常に開きました\n"); fprintf(fp,"これが初めてのファイル入出力です\n"); if (fclose(fp)!=0){ perror("ファイル・クローズに失敗しました\n"); return -1; }else printf("ファイルを正常に閉じました\n"); return 0; } これを実行してもどこにもtest.txtというファイルがありません。 同じプログラムをwinでも実行してみたところ正常にファイルが作られました。 mac初心者なもんで、どうすればいいのでしょうか?

  • htmlのupfileからとopen関数からのファイルの取得の違いについて

    htmlのupfileを利用したファイル取得 <form action=\"$script\" method=\"POST\" enctype=\"multipart/form-data\"> <input type=file name=abc size=50> </form> と open関数を利用したファイル取得 open( INFILE, "<$ImgDir" ); binmode( INFILE ); read( INFILE, $abc, 10240000 ); close( INFILE ); の違いは何でしょうか? 上記2パターンで作成したファイルを同一のアップロードプログラムにかけたのですが、open関数を利用したものが認識されず、アップロードできないのです。 よろしくお願いいたします。

  • fopenのコード

    初歩的なことですがファイルをオープンするfopenの例題で *************************** #include<stdio.h> int main (void) {   FILE  *fp;     fp = fopen ("test1.txt","w");   if (fp==NULL) {     printf ("ファイルをオープンできませんでした。\n");     return 1;   }    else {     printf ("ファイルをオープンしました。\n");   }    fclose (fp);   printf ("ファイルをクローズしました。\n");    return  0; } *********************************というのがあります。 この中のif文の中のreturnの戻り値が1なのはなぜでしょうか? (例題によっては-1というのもありましたが・・。) またどこに戻り値を返すのでしょうか? もしファイルがオープンできなければその時点で終了になるのでしょうか?初歩的なところですがお願いします。

  • 0x00をファイル出力

    #define TEST 0x00 FILE *fp; UCHAR wbuf[1]; wbuf[0] = TEST; if((fp=fopen("test.txt", "w"))==NULL){  printf("open error\n"); } fprintf(fp,"%s",wbuf[0]); fclose(fp); 以上がプログラムでこれを実行するとtest.txtには 文字化けして書き込まれます。 ファイルに0x00と表示させる為にはどうしたらいいですか?

  • c言 ファイルのオープンについて

    #include <stdio.h> int main(void) { int ch; FILE *fp; char fname[64]; printf("ファイル名:"); scanf("%s",fname); if((fp=fopen(fname,"r"))==NULL) printf("ファイルをオープンできません。\n"); else{ while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp); } return(0); } ファイル名は20130603.cで、実行ファイル(exe)と同じディレクトリに入れてあるのに、このプログラムでファイルをオープンできないのです。 このプログラムを実行するために必要なファイルの作成法と、例としてのファイルの内容、実行結果など、教えていただきたいのです。 色々調べてみたのですが、解決法がイマイチ見つかりませんでした。 どうかよろしくお願いします。