エラーが起こる理由を教えていただきたいです

このQ&Aのポイント
  • 課題で出されたツールを自分で書いてみたんですが、エラーが起こる理由が分からないので教えて頂きたいです。
  • 課題の内容は、コマンドプロンプトの引数でディレクトリ名を与えて、そのディレクトリにあるファイルやサブディレクトリにあるファイルから拡張子が「.c」「.cpp」のものを再帰的に全て探します。
  • 探した拡張子のファイルの中身に「//」で始まる行(コメント行)があればすべて置換して消すようにする、といった感じの内容になっています。
回答を見る
  • ベストアンサー

エラーが起こる理由を教えていただきたいです

課題で出されたツールを自分で書いてみたんですが、エラーが起こる理由が分からないので教えて頂きたいです。 ↓リンク先に書いてみたスクリプトとエラー内容が書いてあります。 http://ideone.com/pjxA5 課題の内容は、コマンドプロンプトの引数でディレクトリ名を与えて、そのディレクトリにあるファイルやサブディレクトリにあるファイルから拡張子が「.c」「.cpp」のものを再帰的に全て探します。 探した拡張子のファイルの中身に「//」で始まる行(コメント行)があればすべて置換して消すようにする、といった感じの内容になっています。 rubyを始めてそんなに経っておらず分からない事だらけなので、構文が間違ってるなど、エラーが出る理由を教えて頂ければと思います。

  • Ruby
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

rubyのバージョンが1.9のようですので、magic commentを入れておいてください。 それがないと思わぬエラーがでたりしますので、 http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fm17n.html それとデバッガを使ってみてください。 ruby -rdebug xxxx xxxx のように-rdebugを入れれば使えるようになります。 またrubygemsからruby-debugをインスールする方法もあります。 `initialize': Permission denied - dir1 の周辺にどの行でエラーがあるのか情報があるはずです。dir1フォルダが書き込み(読み込み)禁止になっているような感じですが。 デバッガを使うのが解決の近道だと思います。

momoiropuccho
質問者

お礼

回答ありがとうございます。 返信が遅くなってしまいすみません。 rubyを始めたばかりなのでデバッガあるとは知りませんでした。 試してみたところ、エラーの内容はよくわからなかったのですが、フォルダが書き込み禁止になっていただけというものすごく単純な事だったみたいです。 プログラムの間違ってる箇所ばかり探していたので、初歩的なことに気づけませんでした(-_-;) 無事動くようになったのでご回答本当に助かりました。

その他の回答 (3)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

No.2です MacRuby 0.12 (ruby 1.9.2) ですが、 No.3にkmeeさんが書かれているのと同じ結果です。 Errno::EISDIR: Is a directory - read() failed となります。 dir1が読み込みが禁止されている場合にはopenで Errno::EACCES: Permission denied - open() failed となりますので、実際にはeachの前の17行めのopenでエラーになっているのではないかと思います。 質問者さんはWindowsのようですので、エラーメッセージが微妙に違う可能性はありますが 課題のようですので、ヒントだけ Dir.glob("#{dir}/*")でファイル名を取得しするのがよいように思います。current directoryよりの相対パスでファイル名が得られます。 他にも気がついた範囲で (動作確認はしていないので正しいかは分かりません) 24行目directory?(fullpath)はクラスメソッドに 37行目temp = Tempfile::new(file)は temp = Tempfile.new(file)に 40行目f.read.each{|line|は f.each{|line|に

momoiropuccho
質問者

お礼

返信おそくなってしまい申し訳ございません。 一応フォルダの書き込み禁止が原因だったみたいですが、こちらに書かれているようにスクリプトを修正してみました。 こちらでも問題なく動きましたし、記述的にもスッキリしますね。 再びご回答ありがとうございました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

組み込み関数open→戻り値のFileクラスのインスタンス って、ディレクトリ内のファイル検索に使えましたっけ? 手許のRuby1.8.7p370,Mac では、openはエラーにならないけど、eachでErrno::EISDIR: Is a directory となりました。

momoiropuccho
質問者

お礼

先生はこの方法でもできる的なことを言ってた気がしたんですが、できないんですかね? 一応修正して動くスクリプトは書けたのでこれで問題ないかなと思っています。 回答ありがとうございました。

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

エラーメッセージ通りなら、このプログラムを実行するときに引数を渡してないのでdir変数に値が入っていないんだと思うのですが。

momoiropuccho
質問者

お礼

回答ありがとうございます。 一応引数として「ruby Sub.rb dir1」このようにディレクトリ名を与えたのですが、「`initialize': Permission denied - dir1」というエラーが出てしまいます。 これはコマンドの記述方法が正しくない、ということなんですかね?

関連するQ&A

  • ディレクトリを再帰的に探索する正規表現

    javaファイルを引数に取るプログラムを全てのjavaファイルに対して走らせたいのですが、 あるディレクトリ内(サブディレクトリ内を含めて)のjavaファイルを指定するような正規表現の書き方がわかりません。 直下だけならjava (プログラム名) *.javaで大丈夫なのですが、再帰的にサブディレクトリもさがすにはどのように書けばいいのでしょうか

  • コンパイルエラー

    //test.cpp #include<iostream> #include<string> class test { string hoge; public: test(string str); void method() const; } 14行目  test::test(string str) : test(hoge){} void test::method() const { std::cout << "test" << std::endl; } int main() { string s; std::cout << "名前を入力してください。" << std::endl; std::cin >> s; test aaa(s); aaa.method(); } コンパイルしようとすると下記エラーになります。 エラー E2303 test.cpp 7: 型名が必要 エラー E2139 test.cpp 7: 宣言に ; がない エラー E2293 test.cpp 10: ) が必要 エラー E2147 test.cpp 14: 引数宣言は 'string' で始められない エラー E2111 test.cpp 14: ここでは型 'test' は定義できない エラー E2136 test.cpp 14: コンストラクタには戻り型は指定できない エラー E2316 test.cpp 14: 'test::test(int)' は 'test' のメンバーではない エラー E2451 test.cpp 22: 未定義のシンボル string(関数 main() ) エラー E2379 test.cpp 22: ステートメントにセミコロン(;)がない(関数 main() ) エラー E2451 test.cpp 24: 未定義のシンボル s(関数 main() ) *** 10 errors in Compile *** ■1.型名が必要 →string hoge;と宣言してる箇所でエラー発生。 …stringと宣言してるのになぜでしょうか… ■2.宣言に";"がない →string hoge;と宣言してる箇所でエラー発生。 …";"つけてるのですが… ■3.")"が必要 →test(string str);の行でエラー発生。 …")"はどこで必要なのでしょうか ■4.引数宣言はstringでははじめられない →test::test(string str) : test(hoge){}の行でエラー発生。 …C++って引数をstringで受け取れない…?どういうことでしょうか などなど疑問がいっぱいあるのですが、どこが間違っているのかよくわかりません…ご指導よろしくお願いします。

  • エラー

    A:\prog1.cpp(2) : fatal error C1083: Cannot open include file: 'conio.h': No such file or directory cl.exe の実行エラー このエラーに意味を教えてください。また、どうすればよいと考えられますか。

  • Linuxサーバーでの引数に拡張子があるものの渡し方

    PHPのプログラミングで、URL形式の引数に拡張子(たとえば、.jpgなど)を持ったものを渡そうとすると、WindowsサーバなどではOKなのですが、Linuxの場合、404エラー(そのディレクトリやファイルがない)になってしまうようなのですが、Linuxサーバーでの拡張子のあるものを引数として渡したい場合、どういった書き方をすればいいのでしょうか?

    • ベストアンサー
    • PHP
  • C言語での置換処理について

    引数で指定されたディレクトリ配下のファイル全てに置換処理を行う 処理をC言語で作成したいと考えています。 ディレクトリ配下には、最大で100MB位のファイルが約100件存在する 想定です。 (ファイルのサイズ、件数は実行毎に異なります。) そこで2点ほど教えていただきたいことがあります。 1.基本的に、UNIXコマンドのtrコマンドでで置換するより、C言語で   全てのファイルを開き1行ずつ、「置換文字列のチェック」→   「置換文字列が存在すれば置換」→「ファイル書込み」と行った   ほうが早いものでしょうか?   (trコマンドを実行したところ、10分待っても処理が完了しませんでした。) 2.C言語にてディレクトリ配下のファイル名を取得し、ファイルの   件数分ループさせるにはどのようにすればよいのでしょうか?   execコマンドにて「ls -l test.txt | awk '{print $○}'」   (ファイル名のみ取得)の結果をファイルに出力し、そのファイル   からファイル名を取得し、EOFになるまでループすることで出来る   と思いますが、この方法は一般的でしょうか?   出来れば余計なファイルは、作成したくないと考えています。 ご回答の方、よろしくお願いします。

  • リダイレクト >> を複数のファイルに同時に行いたい

    cat A.txt >> B.txt とコマンドを実行することで、B.txtの末尾にA.txtが挿入されると思います。 これを利用して、複数のファイル(拡張子がtxt)全てにA.txtの内容を挿入させたいのですが、その場合はどういったコマンドを打てばいいのでしょうか? 何か、ディレクトリの中のファイル全てに対して再帰的に処理を施す、という方法がありましたら、お教えください。

  • java プログラミング 文法 エラー

    このjavaプログラムはエラーが出るんですが、何が間違ってるんでしょうか? プログラムは一行のみです。 「cpp: error trying to exec 'cc1plus': execvp: No such file or directory」 エラーは以下の通りです。 [javac] /usr/local/sen/src/java/net/java/sen/util/DoubleArrayTrie.java:1: class または interface がありません。 [javac] cpp: error trying to exec 'cc1plus': execvp: No such file or directory [javac] ^ [javac] /usr/local/sen/src/java/net/java/sen/util/DoubleArrayTrie.java:1: 文字リテラルが閉じられていません。 [javac] cpp: error trying to exec 'cc1plus': execvp: No such file or directory [javac] ^ [javac] /usr/local/sen/src/java/net/java/sen/util/DoubleArrayTrie.java:1: 文字リテラルが閉じられていません。 [javac] cpp: error trying to exec 'cc1plus': execvp: No such file or directory [javac] ^ [javac] エラー 3 個 [javac] 警告 3 個 アドバイスよろしくお願いします。

    • ベストアンサー
    • Java
  • C++ visualstudio グローバル変数

    C++のプログラミングに関する質問です。 visual studio2008を使用しています。 手元に非常に複雑なC++ファイルなどから構成されている1つのprojectがあります。(ヘッダファイルなどもあります) そのため、このprojectをデバッグすると、A.cppファイルをデバッグ→B.cppファイルをデバッグ→A.cppファイルをデバッグ→C.cppファイルをデバッグのように、色々なcppファイルを跨ってデバッグします。 1つのcppファイルには大量の関数があり、cppファイルの先頭や,関数外の部分に例えばA.cppで int test などと宣言すれば、A.cppファイル内ではtestと名付けた変数をすべての関数で使えます。 しかし、あくまでA.cppファイル内だけで使用できるだけで、別のBやC.cpp内で使うことはできません。 このtest変数をB.cppやC.cppファイルでも使えるようにするにはどうすればいいでしょうか? 上で挙げた例でいうなら、A.cppからB.cppファイルに移動する際の関数の引数として渡す方法は考えられますが、実際には、 test変数を使いたいのはかなり後に登場するcppファイルで関数の引数として扱うのは非常に大変です。 (Z.cppでtest変数を使いたい。しかしZ.cppに到達するまでにはA~Y.cppを通り、その間に登場するすべての関数でtestを引数にしなければならない) 関数の引数でtest変数を使えるようにする以外の方法がありましたたら教えていただけると幸いです。 実際にやりたいことは A.cpp内にある関数が実行されたらその数をカウントし(A.cppのこの関数は何度も呼び出される関数) //count ++ このcount++の値によってZファイルのある関数での動作を変えたいと思っています。 if(count<100){ printf("aaa"); } しかし、現状ではZ.cppファイル内ではcountが定義されていないので上のようなif文を書くとエラーになってしまいます。

  • 他人のプログラムを実行すると、「実行できません」のエラーが出ます

    VisualC++初心者です。 移植のため、他人のプログラムをそのまま貰って解析しろと言われています。 ところが、そのままビルドして実行しても、ビルドでエラーは出ないのですが、「プログラムを実行できません」メッセージが出てしまいます。ステップ実行しようとすると、「*.exeファイルが見つかりません。」エラーが出ます。 リソースでSDIのDialogBoxを持っていますが、ソースはすべて拡張子.cで.cppファイルは有りません。 とっかかりが掴めず困っています。 どうすれば実行できるようになるでしょう?

  • occmgr.cppの行410で特定のエラー

    .Net2003で作成したプロジェクトを実行しようとするとoccmgr.cppの行410で特定のエラーが出て実行できません。以下が特定のエラーの内容です。 Debug Assertion Failed!! File occmgr.cpp Line 410 For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. どうすればいいかわかりません。 よろしくお願いします。

専門家に質問してみよう