以前XP環境でVisual Fortran(VF)を使ってBMPファイルを読み込むプログラム使っていました.
PCがWin7になった為,FreeのFortran g95を使用して同様の処理を行いたいのですが,上手くできません.例えば”test.bmp”と言う8bitのファイルを読み込みたいとしたとき,
VFでは
character*1078 temp
integer*1 data
open(10,file='test.bmp',form='binary')
read(10)temp
read(10)data
このときwrite(*,*)dataは133とします.
g95では"binary"が使用できず,
character*1078 temp
chracter*1 data
open(10,file='test.bmp',form='formatted')
read(10,*)temp
read(10,*)data
data2=ichar(data)
write(*,*)data2は32となってしまいます.
画像の輝度は133で,VFで読み込んだ値となります.
上のプログラムで何を直せば g95でも正しい輝度情報を読めるのでしょうか?
どうぞ宜しくお願いします.
No.2ベストアンサー
- 回答日時:
じゃあ,こんな感じ。
character*4 t4
character*1078 temp
character*1 data
open(10,file='test.bmp',form='unformatted',access='direct',recl=1)
do i=1,1078
read(10,rec=i)temp(i:i)
enddo
read(10,rec=1079)data
data2=ichar(data)
write(*,*)data2
end
でもg95で
> access='stream'を代入するとエラーが出てしまいます.
というのはどうしてだろう?私の環境では
$ g95 -v
Using built-in specs.
Target:
Configured with: ../configure --prefix=/mingw --enable-languages=c --with-ld=/mi
ngw/bin/ld --with-as=/mingw/bin/as --host=i386-pc-mingw32 --enable-threads --dis
able-nls --disable-win32-registry --enable-sjlj-exceptions --enable-libgcj --wit
hout-x
Thread model: win32
gcc version 4.1.2 (g95 0.93!) Jun 16 2010
$ cat aa.f95
character*4 t4
character*1078 temp
character*1 data
!integer*1 data
open(10,file='test.bmp',form='unformatted',access='stream')
read(10)temp
read(10)data
!write(10)temp
!write(10)data
data2=ichar(data)
write(*,*)data2
end
$ g95 aa.f95
$ ./a
141.
$
こんな感じだったよ。
で,確かにtest.bmpの1079バイト目をバイナリエディタで確認してもZ'8D'です。
たびたびコメントを頂きありがとうございます.
私の環境では,
read(10,rec=i)temp(i:i)
ではコンパイルを通りません.
ただ,
do i=1,1078
read(10,rec=i)
end do
read(10,rec=1079)data
data2=ichar(data2)
write(*,*)data2
とすると「133」が表示され,正しい値を返しているようです.
*********
教えて頂きましたプログラ中
character*4 t4
は何でしょうか?
また
read(10,rec=i)temp(i:i)
はどう言う意味になるのでしょうか?
普段使用しない書き方なので良く意味がとらえられません
*********
おそらく教えていただきましたコメントで,
私の行いたかったことができそうです.
上記に関するコメントは,お時間のある時で構いませんので
ご教授頂ければと思います.
本当に有難うございました.
No.3
- 回答日時:
> 教えて頂きましたプログラ中
> character*4 t4
> は何でしょうか?
これはちょっと違うことを書いていたときに使った変数で,今となっては単なるゴミです。
消してもかまいません。
> また
> read(10,rec=i)temp(i:i)
> はどう言う意味になるのでしょうか?
> 普段使用しない書き方なので良く意味がとらえられません
文字部分列と言われるもので,文字列の連続する部分集合を表します。
string ([ starting-position ] : [ ending-position ])
こんな感じで使用して,文字列中での開始位置と終了位置を指定します。
だからtemp(i:i)は文字列tempのi文字目を表し,10番のファイルのi番目のレコードを文字列tempのi文字目に読み込むことになります。ファイルの1バイト目から1078バイト目が必要でなければ,doループ全体が必要ではなく
character*1 data
open(10,file='test.bmp',form='unformatted',access='direct',recl=1)
read(10,rec=1079)data
data2=ichar(data)
write(*,*)data2
end
これでも同じ結果を返すはず。
No.1
- 回答日時:
わざわざg95で確かめることはしてないけど
character*1078 temp
character*1 data
open(10,file='test.bmp',form='unformatted',access='stream')
read(10)temp
read(10)data
data2=ichar(data)
write(*,*)data2
end
こんな感じ?
コメント有難う御座います.早速試したところ,
open(10,file='test.bmp',form='unformatted',access='stream')
のaccess='stream'を代入するとエラーが出てしまいます.
access='stream'を削除した場合,
read(10)temp
read(10)data
でread(10)tempによりデータを読みに行った箇所でエラーが出てしまいます.
私もはじめ教えていただいたものと同等のプログラムで動くかと思ったのですが,unformatted,read(10)の記述でエラーが出てしまい,formatted, read(10,*)だと何とか動くのですが,帰ってくる値が以前のものと違い,何処に問題があるのかわからずにおります.
何かご存知でしたら教えていただければ大変助かります.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- ドライブ・ストレージ HDDのチェック方法 6 2022/05/04 09:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
printfの%eで指数部分の桁数を...
-
【Excel VBA】10進数を2進数に...
-
python 気象データの取得
-
ファイルから読み込むC言語の問題
-
C言語の勉強しています。すみま...
-
エクセルVBA:日付データの変換...
-
fortran g95を使ってBMPを処理...
-
'dataType' 引数を Null にする...
-
linuxのシェルでファイル名に先...
-
画像処理のチェーンコード
-
掲示板CGIで新着順ではなく古い...
-
int型(2バイト)データの分割
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
機種依存文字をチェックしたい。
-
DataGridViewの特定列に入力さ...
-
UTF-8で5~6バイトになる文字コ...
-
「1TB」のHDDに日本語は何字入...
-
char str[256]の256の意味は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
linuxのシェルでファイル名に先...
-
int型(2バイト)データの分割
-
【Excel VBA】10進数を2進数に...
-
C#でのswitch文
-
データの値の近いものをグルー...
-
C言語 ファイル内のデータと入...
-
10個の実数に対する降順ソート...
-
C言語の構造体にてバブルソート...
-
'dataType' 引数を Null にする...
-
matlabのソースコードをpython...
-
C言語の勉強しています。すみま...
-
c言語での wavファイルの編集(...
-
テキストファイルの結合について
-
C言語についてです! 同じ年の...
-
sort関数でひらがなとカタカナ...
-
matlabでのRRI検出
おすすめ情報