> 一つは、読み込みをCStdioFileで読込んでいるのですが、データがなくなったかを調べ
> るにはどのようにしたらいいのでしょうか??
CStdioFile::ReadString のヘルプに
「戻り値
テキスト データを保持するバッファへのポインタを返します。
データを読み込まずにファイルの終わりに達した場合は NULL
または FALSE を返します。」
とありますから、そこで判断すればよいのでは?
>あと、出力で「0x75850001」というデータを読込んで処理した結果が、85 75 01 00とい
>うように出力させるにはどうしたらいいのでしょうか??
データを何(型)に読み込んでどういう処理をした後出力するのかによって
適切な方法は違うと思うが?
出力時にCStdioFileを使わないのだけは確か。
2002/08/14(水) 20:03:57のソースでは
(0~255)に変換したものを書き出したいようだったが??
>一応結果が出力されました。
今何ができていて後何をしたいのかさっぱり???
勝手に課題を出させていただきます。
unsigned char a = 133;
short b = 133;
int c = 133;
float d = 133.0;
double e = 133.0;
上記5つの変数の値をCFile::Write()を用いて
ファイル出力し、その内容をバイナリエディタで確認してください。
>WaveFile: Sample AVIFile File Handler
と言う「MSDN」サンプル見たことありますか
あなたがここで質問している内容の90%位は解決できるのでは
ないですか
>あと、出力で「0x75850001」というデータを読込んで処理した結果が、85 75 01 00と
い
>うように出力させるにはどうしたらいいのでしょうか??
共用体 union を使うと出来そうです♪。
typedef union {
int nValue;
DWORD dw;
char str[sizeof(int)];
} _uni;
_uni uni;
uni.str[x] (xは0から3) に対して行った操作は uni.nValue や uni.dw に反映します。
http://black.sakura.ne.jp/~third/c39.html
http://www.kumei.ne.jp/c_lang/intro/no_32.htm
皆様ありがとう御座いました。一応完成いたしました。
しかし、リトルエンディアンで出力させたいのですがこの方法ではうまくできませんで
した。このクラスで出力させることはできるのですか??
下記はプログラムの一部文です。
CString data;
char *end;
int I,Q;
CStdioFile nFile( FilenameN , CFile::modeRead | CFile::modeNoTruncate |
CFile::typeText);
switch (wBitsPerSample) // 量子化ビット数の判定
{
case 8: // 量子化ビット数が8ビットである
switch (nChannels) // チャンネル数の判定
{
case 1: // チャンネル数が1(モノラル)である
{
signed int numI;
CStdioFile sFile( FilenameS , CFile::modeReadWrite | CFile::modeNoTruncate |
CFile::typeBinary);
//出力ファイルの終端を開始点に設定(WAVEフォーマット情報の後に移動させる)
sFile.Seek( 0 , CFile::end );
// 入力ファイルからデータを一つ取り出す(一行で一つのデータと考える)
while (nFile.ReadString(data) !=NULL)
{
CString dataI = data.Mid(0,6); // Ⅰ成分の情報の取得
I = strtol(dataI , &end , 16); // CStringで読込んだ文字列をlong 整数値に
変換
// I成分を書込むためにI成分を補正する(まず256レベル落とす。範囲が0~256な
のでそれに128をプラスする)
numI = ( I ) / (256) + (128);
dataI = (numI);
sFile.WriteString((dataI));
}
nFile.Close();
sFile.Close();
}
>リトルエンディアンで出力させたいのですがこの方法ではうまくできませんでした。
>このクラスで出力させることはできるのですか??
>リトルエンディアンで出力させたいのですがこの方法ではうまくできませんでした。
うまくいかなかったんですよね?
てことは
>このクラスで出力させることはできるのですか??
できないんじゃないでしょうか?
出力されたファイルをバイナリエディタで見てみてはどうでしょうか?
#解決策としてはbyteスワップがありますが、
#スマートな方法ではありませんね(^^;;
>このクラスで出力させることはできるのですか??
このクラスって何ですか? CString?
>numI = ( I ) / (256) + (128);
>dataI = (numI);
>sFile.WriteString((dataI));
本当に動くのかなぁ?
後でやってみよ
動くとしても個人的には許しがたいコードだけど。
もしかしてCString以外ファイルに読み書きできないとか思ってない?
? numI = ( I ) / (256) + (128); もしかしてこれって
「成分を補正する(-32768~32767)→(0~255)へ変換処理」ではなく
リトルエディアンにするためにビット演算とかしたかったの?
>リトルエンディアンで出力させたいのですがこの方法ではうまくできませんでした。
なぜ、エンディアン??もうちょっと、考えてみてください。
>CStdioFile sFile( FilenameS ,
> CFile::modeReadWrite | CFile::modeNoTruncate | CFile::typeBinary);
CStdioFileのクラス概要をよく読んでください。これは、『テキストモード』の
ファイル入出力クラスです。派生元のCFileクラスを使ってください。
そうすれば、リトルエンディアンのまま書き出せます。
この人全然、概要呼んでいないみたいですけど
>wood 2002/08/15(木) 12:46:03
の発言、多少皮肉ってますけど完全無視で参考にもされていないみたいだし
CStdioFileのクラスで書き込みを行うと文字ストリングの最後のNULLは
改行コードに変換されることくらい知っているはずですけど
>CStdioFileのクラスで書き込みを行うと文字ストリングの最後のNULLは
>改行コードに変換されることくらい知っているはずですけど
知らないんじゃないの?
「リトルエンディアン」って言葉を知っているのが不思議。
とりあえず、
>numI = ( I ) / (256) + (128);
>dataI = (numI);
>sFile.WriteString((dataI));
これは動いた。落ちなかった。感動!!
もちろん書き込まれたデータは役に立たないけど。
でもこんな処理・・・普通考え付くのかなぁ?
計算にもなんの意味もないし。
中途半端なアドバスは無視されるようなので報告だけ。
っつーかやりたいことは
テキストの16進数読んで加工してバイナリに落とす。
ってだけの作業でしょ。
誰か金で雇ってやってもらったら?
理解はしてもらえないだろうけど、
私はバイナリファイルを作る場合は、それほど大きなデータでなければ
vector<BYTE>に全部入れてしまってWriteFileで一気に書き出すのが好きです。
好みの問題ですが。
CString::operator=(TCHAR)と解釈されるみたいですね。
面白い。
dataI = (numI);
sFile.WriteString((dataI));
の部分を
sFile.Write(&numI, sizeof (int));
に変更しないと...
あるいわ
short numS;
sumS = numI;
sFile.Write(&numS, sizeof (short));
とか
CStdioFile
http://homepage2.nifty.com/xad/C/Group16/CStdioFile.htm
File操作
http://www2c.airnet.ne.jp/phy/c++/41.html