• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:std::ifstreamについて)

std::ifstreamについての質問

このQ&Aのポイント
  • std::ifstreamを使用してファイルをバイナリモードで展開しようとすると、フルパスを指定すると展開に失敗します。
  • ファイルが存在しているかどうかはウィンドウにドロップされたファイルを基にして判断できます。
  • 解決方法をご教示いただける方、よろしくお願いします。

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

  • ベストアンサー
回答No.1

 こんばんは。  std::ifstreamにstd::ios::binaryを指定していないか、DragQueryFile()APIに渡す受け取りバッファのサイズが1文字分足りないかのどちらかでは。  パスの文字数+1でバッファを割り当てて、受け取る際もDragQueryFile()APIに文字数+1を指定しないと最後の一文字が欠けてしまいます。 #include<windows.h> #include<string> #include<fstream> LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: return 0; case WM_CLOSE: ::DestroyWindow(hWnd); return 0; case WM_DESTROY: ::PostQuitMessage(0); return 0; case WM_DROPFILES: { HDROP hDrop = reinterpret_cast<HDROP>(wParam); //ファイルの数を取る const UINT uiCount = ::DragQueryFile(hDrop, -1, NULL, 0); for(UINT ui = 0; ui < uiCount; ++ui) { //ファイルパスの文字数を取って+1する const UINT uiStrLen = ::DragQueryFile(hDrop, ui, NULL, 0) + 1; //受け取る為にバッファを割り当てる LPTSTR pszPath = new TCHAR[uiStrLen]; //バッファに文字列を受け取る ::DragQueryFile(hDrop, ui, pszPath, uiStrLen); //バイナリモードで開く std::ifstream ifs(pszPath, std::ios::in | std::ios::binary); //ビットマップであるかどうかを判定してみる BITMAPFILEHEADER bmif; ifs.read(reinterpret_cast<char*>(&bmif), sizeof(bmif)); if(bmif.bfType == ('B' | ('M' << 8))) ::MessageBox(hWnd, NULL, TEXT("ビットマップです"), IDOK); //バッファの消去 delete pszPath; } ::DragFinish(hDrop); } return 0; } return ::DefWindowProc(hWnd, uMsg, wParam, lParam); }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • std::ifstreamについて

    #include <iostream> #include <fstream> int main( int argc, char** argv ) {   if( argc == 1 )     return -1;   std::ifstream ifs( argv[1] );   if( ifs.is_open() == false )     return -1;   return 0; } C++で上記のようなコードを書いてコンパイルし、出来上がった実行ファイルにアスキーフォーマットのテキストファイルをドロップしたのですが、どうしてもファイルの展開が成功しません。 確認したところ、一応argv[1]には正しいフルパスのファイル名が入っていました。 なぜファイルの展開に失敗するのでしょうか? よろしくお願いします。 /* WindowsXP Professional32bit Core2Duo 2.44GHz VisualStudio2005 Academic Edition VisualStudio2008 Academic Edition */

  • C++のifstreamの使い方

    C++のifstreamの使い方で分からない所があるので、分かる方御教示ください。 下記は、C++で読み込んだファイルの中身が空だった場合を無理やり例外処理を使って書いてみたのですが、中身が存在する場合、たとえば、 line1 line2 line3 ではline1を無限に繰り返してしまいます。(1)を ifstream instream = inStream(argv[1]); while (instream >> input) にするとうまくいくようなのですが、この違いがよくわかりません。 違いを教えてください。 #include <iostream> #include <string> #include <fstream> using namespace std; ifstream inStream(char *str); int main(int argc, char *argv[]) { if (argc < 2) cout << "ファイル名を指定してください" << endl; else { try { string input; while (inStream(argv[1]) >> input) // (1) cout << input << endl; } catch (int i) { cerr << argv[1] << "を開けません" << endl; } } return 0; } ifstream inStream(char *str) { ifstream inStream(str); if (!inStream) throw 1; return inStream; }

  • ファイルサイズを変更したい

    visualstudio2010を使用しています。 c言語で書いているのですが、 test.txt ←abcdefg ファイルサイズ1KB Wtest.txt←書き込み用ファイル 上記のようなファイルがあり、バイナリでtest.txtを読み込みWtest.txtに書き込みたいと思っています。 その際に、1KBのtest.txtを5KBになるまでバイナリで「abcdefg」の後に0を代入したいのですがどう書けば良いのかわかりません。 FILE *fp, *fpw; char *fname = "test.txt"; char *fname_w = "Wtest.txt"; unsigned char buf[10000]; int size; fp = fopen( fname, "rb" ); if( fp == NULL ){ printf( "%sファイルが開けません\n", fname ); return -1; } fpw = fopen(fname_w, "wb"); if(fpw == NULL){ printf( "%sファイルが開けません\n", fname_w ); return -1; } size = fread( buf, sizeof( unsigned char ), sizeof (fp), fp ); /*ここに処理を追加したい*/ fwrite( buf, sizeof( unsigned char ), size, fpw);

  • ファイルの出力先がうまく指定できません。。

    今、ファイルの出力先を変更させたいと思っていて、 調べたところ、fp=fopen("フォルダ名/test.txt","wb") のようにすればよい、というところまでは調べたのですが、 私の場合、ファイル名を、filenameというchar型の変数に入れており、 fp=fopen(filename,"wb")となってます。 これを、fp=fopen("フォルダ名/filename","wb")としてみたのですが、 これではダメでした。 ファイル名の入っている変数はそのまま使いたいのですが、 それでパス指定をする方法ありますでしょうか?

  • バイナリ形式でデータの入出力をしたい

    STLやstringが規格化されていない時代の古いC++の本しか持っていない私の唯一の教科書はマイクロソフトのライブラリだけなのですが時々どこに必要な事項が載っているか探しきれないことがあります その1つとして バイナリデータを読み出したり書きこんだりするにはどうするかということです バイナリファイルinfile.exeの読み出のためのファイルとの接続として ifstream ifs; ifs.open("infile.exe",ios::in|ios::binary); としバイナリファイルoutfile.exeの読み出しのためのファイルとの接続として ofstream ofs; ofs.open("outfile.exe",ios::out|ios::binary|ios::trunc); としましたがこれは正しいやり方なのでしょうか? もし不備があれば指摘してください とくにファイル名の次のモードについて指摘していただければ幸いです (なかでもios::truncが心配)

  • 固定幅フィールドのテキストデータをifstreamを使って読み込む方法

    固定幅フィールドのテキストデータをifstreamを使って読み込む方法 について教えてください。 計算結果の出力ファイルに1行につき8カラム、20カラム、10カラムのデータがあるとします。 例えば 1.2345671.2345678912345678911.23456789 このデータ行には 1.234567(8カラム幅) 1.234567891234567891(20カラム幅) 1.23456789(10カラム幅) の3つの固定小数点の数字が書かれています。 上記例のように3つ(複数)の数字が必ずしもホワイトスペース区切りにはなっていないものとします。 これをC++標準ライブラリのifstream や stringstreamを用いて読み込む場合、どのような記述をしなければならないのでしょうか? たとえば、 int main(int argc, char** argv) { double data[3]; char buf[BUFSIZ]; ifstream ifs( argv[1] ); // argv[1] には上記データが書かれたファイル名が入っているとします。 stringstream str; while( !ifs.eof() ) { if( !ifs.getline( buf, BUFSIZ, '\n' ) ) break; str << buf; str >> setw(8) >> data[0] >> setw(20)>> data[1] >> setw(8) >> data[2]; } cout << data[0] << " " << data[1] << " " << data[2] << endl; return 0; } のような書き方だと、以下のように出力されてしまい、幅を指定しているsetw()が効いていません。 1.23457 0.234568 0.234568 恐らく、'.'がセパレータとして使われて読み込まれているものと思います。 sscanf( buf, "%8lf%20lf%10lf", &data[0], &data[1], &data[2] ); を使うしか方法が無いのでしょうか? 開発環境は ubuntu上のg++ 4.4.3 です。

  • 添削おねがいします

    初心者ですいませんが添削お願いできますでしょうか? jpegのファイルをバイナリとして表示したいのですができません。 以下のプログラムではどこがだめなんですか? #include<stdio.h> main() { int a[100],i; FILE *fp; fp=fopen("test.jpg","rb"); for(i=1;i<=100;i++){ fscanf(fp,"%x",&a[i]); printf("%x",a[i]); } fclose(fp); }

  • デスクトップにfopen()したい(C言語)

    #include <stdio.h> int main(){    FILE *fp;    fp = fopen("デスクトップのパス\\ファイル名","w");    fclose(fp);    return 0; } のようにして、デスクトップ上にファイルを作成したいと思ってます。 どうすればデスクトップのパスが取得できますか?教えてください!

  • バイナリで書き込みましたがエラーが出る。原因は?

    拡張子を.wavとしてあるa.wavというファイルがあります。 fopenとfread関数を用いて以下のように読込み、 fp = fopen("a.wav","rb"); fread(data[0],4,1,fp); fopenとfwriteを用いてb.wavファイルに以下のように書き込みました。 fa= fopen("b.wav","wb"); fwrite(data[0],4,1,fa); 書き込んだb.wavファイルですが、 バイナリエディタStirlingでa.wavとb.wavファイルの中身を比較したら中身は同じでした。 しかし、a.wavファイルでは音が出力されるのに、b.wavファイルでは音が出力されずエラーが出ます。 この原因はいったいなんでしょうか? 原因がわかる方がいましたら教えていただけないでしょうか? よろしくお願いいたします。

  • fread関数の使い方がわかりません。

    以下のプログラムで試しているのですが、コンパイルはできても各配列の要素が表示されません。なぜなんでしょうか? #include<stdio.h> main() { FILE *fp; int i,b[10]; char a[10]; gets[a]; //ファイル名を指定 fp = fopen(a,"rb"); //バイナリモードでオープン fread(b,3,10,fp);   //配列に3byteづつ書き込んだつもり for(i=0;i>=9;i++){ printf("%02x\n",b[i]); //この部分の表示がされない。 } fclose(fp); } レベルの低い質問ですいませんがよろしくお願いします。