BMP画像を開いてデーターの総量でショートカットを起動するというのを書いてみたんですが・・・fopenすらできなかったという悲惨な事態に・・・。
本当はBMPでRGBの量によって判別するつもりだったんですけど、どうもBMPの構造や、開いた後の変数への入れ方等が出来なくて苦戦してます。
BMPの構造等読んでも正直開くことも出来ないぐらい自分レベル低いですがソースを書いてみました。
一応二つ・・・どっちも動かなかったんですけど、イメージはこんな感じです。
fopenで開いた後はforとかで配列に入れるだとか、fopenなら開いてるファイルのバイトがわかるやら色々サイトを見てきたんですが理解できなかったです。
structとか苦手なので半分くらいしか本当は解ってないのでですが・・・。
出来ればfopenのやり方を教えていただければあとは比較する文ぐらいなら自分で考えられそうなんですが(~~<~~とか)
ヒントを教えてください。(ヒント言われても自分理解できるのかな・・・)
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
typedef struct tagBITMAPFILEHEADER {
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER;
FILE *fpr;
long bitsize,hutatume;
fpr=fopen("テスト.bmp","r");
bitsize=0;
fscanf(fpr,"%ld","bfSize",&bitsize);
if(bitsize>0){
printf("一応ちゃんと読みこめている");
}
return 0;
}
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
int main(void)
{
FILE *fp;
char *fname = "test.bmp";
long size;
int A=1000;
fp = fopen( fname, "rb" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
}
fseek( fp, 0, SEEK_END );
size = ftell( fp );
if(size>A){
ShellExecute(NULL, _T("open"), _T("http://www.yahoo.co.jp"), NULL, _T(""), SW_SHOW);
}
fclose( fp );
return 0;
}
No.4ベストアンサー
- 回答日時:
まずは、基礎を勉強してから。
「どっちも動かなかったんですけど」とありますが、具体的に、どんな動作をしたのですか?エラーになったのなら、どんなエラーメッセージが出ているのですか?
プログラムを修正するときは、どこが原因でどう「動かない」かを確認することが大事です。
2つ目のプログラムは、ファイル指定さえ間違えなければ、問題無く動作するはずです。
一般の範囲では、致命的な間違いはありません。
(intの最大値を越えると問題ですが、そんなBMPはまずありません)
絶対パスを書くときは、\の扱いに注意しましょう。
1つめのプログラムは、見ただけでわかるの問題点があります。
・失敗しているのは、fopenなのか、それ以外なのか?それを調べましょう。
fopenは失敗の多い関数です。成功したかどうかを確認するのが普通です。
1例として、fopenのあとに次のコードを入れるなどします。これは、エラーメッセージを出力して終了します。
if( fpr == NULL ) {
perror(NULL);
return 1;
}
/* 2つ目のプログラムには同様の処理が入っているんですが。 */
perrorについては、マニュアルを。
http://msdn.microsoft.com/ja-jp/library/9t0e6085 …
既に指摘があるように、ファイルがカレントディレクトリにあるか?ファイル名が間違っていないか等を確認してください。
・fopenのモードに注意しましょう。
Windowsの場合、バイナリモードとテキストモードで動作に違いがあります。
BMPのようなバイナリファイルを読むときに、テキストモードを使うと正常に読み込むことができません。
・fscanfはテキストファイルから読み込んだ文字列を、書式に従って変換して変数などに取り込むものです。
バイナリファイルであるBMPから、%ldで「数字の並んだ文字列」を読み込むなど、まずありえません。
また、
fscanf(fpr,"%ld","bfSize",&bitsize);
の場合、 %ldに対応しているのは、第3引数である"bfSize"です。
このように記述された文字列リテラル(文字列の定数)は、const char *型のポインタとして処理されます。
仮に、%ldで数値が読み込めたとしても、その読み込み先は、"bfSize"の文字列が格納されているメモリ空間であり、変数bufsizeではありません。
おそらく、保護されている領域への書き込みになり、エラーで止まるでしょう。
No.3
- 回答日時:
「わからない」ばかりで、とてもプログラミングができるレベルには見えないのですが……。
あなたの場合、基礎が全く出来ていませんので、まずはプログラミングの入門からやり直すべきです。
No.2
- 回答日時:
>出来ればfopenのやり方を教えていただければあとは比較する文ぐらいなら自分で考えられそうなんですが(~~<~~とか)
>ヒントを教えてください。(ヒント言われても自分理解できるのかな・・・)
なら、とりあえず確認すべき点として1つ。
>fpr=fopen("テスト.bmp","r");
>char *fname = "test.bmp";
>fp = fopen( fname, "rb" );
相対パス指定のようなので「カレントディレクトリにそのファイルが存在」しますか?
# 絶対パスではないですから相対パス…ですわな。
No.1
- 回答日時:
以前使ったソースを わざと切り貼りしたサンプル
エラー処理は削ってますし切り貼りなのでそのままではエラーになるかもしれませんが
必要な基本的情報は網羅してるはずです
資料読んで理解できない人がここで回答して理解できるのかという根本疑問があるので
あとは自分で調べてください
BITMAPFILEHEADER bmpfh;
CFile file;
LPBITMAPINFO lpbmi; // BITMAPINFO 構造体 へのポインタ
int nHeaderSize;
// BMPヘッダサイズ
nHeaderSize = sizeof(BITMAPFILEHEADER);
// ファイルを開く
file.Open("ファイル名", CFile::modeRead | CFile::typeBinary | File::shareDenyNone)
//BMPファイル(ヘッダ)情報を読む
file.Read((void *) &bmpfh, nHeaderSize)
// データ読み込みのために、グローバルメモリを割り当てる
BYTE *m_pDIB
m_pDIB = (BYTE *) new char[file.GetLength() - nHeaderSize];
// バッファに画像情報+色データを読み込む
file.ReadHuge(m_pDIB, file.GetLength() - nHeaderSize);
file.Close();
lpbmi = (LPBITMAPINFO)m_pDIB;
//画像情報へのアクセス例
lpbmi->bmiHeader.biWidth //画像 横サイズ
lpbmi->bmiHeader.biHeight; //画像 縦サイズ
//メモリ開放
delete m_pDIB
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォトショップでのアイコン作成
-
Windous Media PlayerからAudac...
-
拡張子ctbとdwgを開くには
-
PV4で録画したDVファイルがAviU...
-
edrawingのEASMを線画にしたい。
-
ラベル屋さんでJPEGファイルを...
-
prnファイルの印刷方法
-
DVD FlickでのMOVファイル読込...
-
[Tool] Zipファイルの正常/異常...
-
フォトショップエレメンツは通...
-
Audacity、聞々ハヤえもんでの...
-
jpeg画像で印刷できないことが...
-
MPEG2レンダリングするといつも...
-
フォトショップで切抜いたJPG画...
-
illustratorとDTPとFTPをうまく...
-
PhotoRecordでPDFってできますか?
-
WORDからPDFに変換した時に画像...
-
テキストエディタ vim のコマン...
-
画像が登録できない、見れない...
-
DVD Flickでファイルを追加する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォトショップでのアイコン作成
-
[Tool] Zipファイルの正常/異常...
-
拡張子ctbとdwgを開くには
-
プリンターで印刷する時にファ...
-
ゲームが起動しません ぶるーす...
-
DVD FlickでのMOVファイル読込...
-
Windous Media PlayerからAudac...
-
jpeg画像で印刷できないことが...
-
DVD Flickでファイルを追加する...
-
WORDからPDFに変換した時に画像...
-
複数(大量)のPDFファイルを印...
-
ラベル屋さんでJPEGファイルを...
-
sound one free版 wav保存 再生...
-
サイズの異なるPDFファイルを作...
-
Irfan View で簡単に印刷する方...
-
往復はがきにEXCEL住所録が読み...
-
rarファイルの結合解凍のエラー...
-
Office2007のVBAのDLLファイル?
-
foobar2000 ファイルの場所変更
-
エクセルで別ファイルのシート...
おすすめ情報