前提・実現したいこと
画像ファイルを読み込みたい
発生している問題・エラーメッセージ
読み込みたい画像ファイルをどのディレクトリに置けばいいのかわからない
該当のソースコード
画像ファイルを読み込む部分のソースコードです
#include<stdio.h> #include <stdlib.h> #include"pgmlib.h" void hough(int n); int main(void) { load_image(0, ""); //hough(0); return 0; }
試したこと
ソースコードのあるディレクトリなどに画像ファイルを置いてみたりしましたが、ファイル名を入力しても「その名前のファイルは存在しません」と表示されてしまいます
カレントディレクトリを調べてみてください
https://camedphone.com/archives/112
https://ja.stackoverflow.com/questions/68966/c%E8%A8%80%E8%AA%9E%E3%81%A7%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84
> 画像ファイルをどのディレクトリに置けばいいのか
発想が逆:
【「俺はここに画像ファイルを置くぜ!」っていうのを決めて,その場所から画像を読み込む形の実装を行う】
とすれば良いように思えます.
> ファイル名を入力しても「その名前のファイルは存在しません」と表示されてしまいます
この状況が謎。タグに「Visual Studio」がありますが、Visual Studio 2019などでファイル名を入力したときのエラー表示ですか? どういうコンパイル(ビルド)をして、どのように実行しているかなど、詳細な状況を説明してください。
ご教授いただいたようにカレントディレクトリを調べたところ、画像ファイルはカレントディレクトリには置かれていました。
このプログラムを実行すると入力ファイル名を尋ねてくるので、カレントディレクトリ内の画像ファイル名を入力すると読み込んでくれるはずなのですが、同名のファイルがないときと同じ表示になってしまいます。
> 入力ファイル名を尋ねてくるので、カレントディレクトリ内の画像ファイル名を入力すると読み込んでくれるはず
「load_image(0, "");」を「load_image(0, "hogehoge.jpg");」みたいに変えて、存在するファイル名をコード中に記入したら、正常に読めるのでしょうか?
あるいは、「load_image(0, "c:\\aaa\\bbb\\hogehoge.jpg");」みたいに絶対パスで書いたら、どうでしょうか?
https://programming.pc-note.net/cpp/filestream.html
の一番上に記載のコードで、「C:\\test.txt」を「test.txt」に変えてコンパイルして実行して、「test.txt」が作成される場所が、パス指定せずにファイル名だけで読み書きできる場所のはずです
もしそれが、現在画像ファイルが置かれている場所と同じなら、
・指定してる画像ファイル名が実際と違う
・「load_image()」の仕様(どこの場所からファイル読み込むかとか)が特殊
なのかもしれません
前者は、注意深く再度ファイル名を確認して実行してみてください
それでもダメなら、後者かもしれないので、「load_image(0, "hogehoge.jpg");」みたいに存在するファイル名をコード中に記入してファイル読み込めるかを確認してみてください
それでも読めないなら、「load_image()」が何かおかしい
> #include"pgmlib.h"
「pgmlib.h」という名前からの想像ですが、もしかしたら「load_image()」では「PGM」ファイルしか読めないのでは?
「pgmlib.h」って、
https://www.asakura.co.jp/detail.php?book_code=12206
のですか?
> 「pgmlib.h」って、
https://www.asakura.co.jp/detail.php?book_code=12206
のですか?
上記がYesと仮定して、以下を書きます
そうではないなら、スルーしてください
上記Webページから「サンプルプログラム」を落として展開し、その中の「pgmlib.h」を使って質問のコードをVisual Studioでコンパイルし、できたexeをコマンドプロンプトで実行してみました
実行前に、exeがあるパスに「cd」してます
まず、画像ファイルがそこに無い場合は、下記のようになりました
(行頭の「>」は、実際には表示されてません)
> 入力ファイル名 (*.pgm) : aaa.pgm
> その名前のファイルは存在しません.
ファイル無いのだから、当然ですよね
次に、サイズが0の空っぽの「aaa.pgm」というファイルを、exeと同じ場所に置きました
> 入力ファイル名 (*.pgm) : aaa.pgm
> ファイルのフォーマットが P5 とは異なります.
ファイルは読み込まれてますね
同様に、サイズが0の「aaa.jpg」というファイルが、exeと同じ場所にある場合
> 入力ファイル名 (*.pgm) : aaa.jpg
> ファイルのフォーマットが P5 とは異なります.
pgmファイルじゃなくても、読み込まれてますね
「pgmlib.h」がその書籍のものならば、カレントディレクトリに画像ファイルがあれば、(画像ファイルの形式によらず)読み込んではくれるので、
> その名前のファイルは存在しません.
とはならないはずです
詳細な回答ありがとうございます。
参考にしている書籍やpgmlib.hに関しては記載されているものであってます。
Visual Studioを使用する前に、テキストエディタで作成したソースコードをコマンドプロンプトでコンパイルして実行していたのですが、別の箇所でエラーは出ていたもののpgm画像の読み込みはできていました。
>https://programming.pc-note.net/cpp/filestream.htmlの一番上に記載のコードで
の部分を試そうとしたのですが、よくわからなかったのでコード中にファイル名を入力する方法を試してみたのですが結果は同じでした。
> コード中にファイル名を入力する方法を試してみたのですが結果は同じでした。
(1) 何か適当に fopen 等を用いて既存ファイルから数バイト読み出すような処理を書き,
(2) その「ファイル名」を示す文字列をそのまま(1)に与えてみる
ということをしたらどうなるのでしょう?
* (1) がまともに動作するのであれば,「ファイル名」を示す文字列自体は(一般的なパスの記述としては)妥当であると判断できるのではないでしょうか.
→その場合,その load_image() とかいう関数の仕様が謎ということで,中身がわからない外野には回答不能である気がします.
* (1) でも失敗するのであれば,「ファイル名」の与え方等が間違っているということだと判断できるでしょう.
> >https://programming.pc-note.net/cpp/filestream.htmlの一番上に記載のコードで
> の部分を試そうとしたのですが、よくわからなかった
質問に掲載されてるコードの代わりに、上記WebページのコードをVisual Studioにコピペして、コード中の下記だけ変更して、ビルドして実行するだけなのですが
const char *fileName = "C:\\test.txt";
↓ 修正
const char *fileName = "test.txt";
特別なライブラリとかは使ってないので、Visual Studioの設定はそのままでビルドできると思う
回答2件
あなたの回答
tips
プレビュー