アプリ版:「スタンプのみでお礼する」機能のリリースについて

Visual C++ 2008 Express Editionを使ってプログラムを書いています。
ネットワークHDDから連番になっているファイルを読み込みたいのですが、
どうすればいいでしょうか?

現状は、for文で (char) filename[100]という変数にファイルパス付の連番のファイル名
(\\\\IPアドレス\\フォルダ名\\ファイル名)を次々に代入して、

if( _sopen_s( &fh, filename, _O_RDONLY,_SH_DENYWR,_S_IREAD) == 0 ){
filesize=_filelength( fh );
offset=filesize-MX*MY*2;
printf( "File length : %ld\n", filesize );
printf( "Offset length : %d\n", offset );
_close( fh );
}

else {
printf("\n file open error ");
return 1;
}

という形で読み込みをすると、file open errorとなってしまいます。

コード1行目のfilenameのところを"\\\\IPアドレス\\フォルダ名\\ファイル名"とすると
読み込みできるのですが、上のコードだと読み込むことができません。
(char)に代入したことで\がファイルパスを指定するものとして認識されていないのかな、
と思って調べているのですが、経験も浅いので解決策がわからず、困っています。
初心者の未熟者ですが、ご教示よろしくお願いします。

A 回答 (4件)

>ちなみに下のコードで出てくるfilename018.txtというファイルには、一行ごとに


>\\\\192.168.○○.○○\\018\\0001.tif

外部ファイルから読んだり、キーボードなどからファイル名を入力する場合は
'\'を"\\"にエスケープする必要はありませんが…

_sopen_s()の戻り値はどうだったのでしょうか?
192.168.○○.○○のマシンでWindowsのファイル共有は正しく動作しているのでしょうか?
    • good
    • 0
この回答へのお礼

連絡遅くなりました。
\を\\にエスケープせずにやったら出来ました!
助かりました!!ありがとうございました。

お礼日時:2010/08/02 22:57

ファイル名を読み込むテキストファイル内の


"\\\\IPアドレス\\フォルダ名\\ファイル名"

"\\IPアドレス\フォルダ名\ファイル名"

に変えて実行すれば?

\ を \\ にするのはソースコード中に記載する場合などコンパイラーへの指示です。データとして読み込む場合は必要ないでしょう。
    • good
    • 0
この回答へのお礼

連絡遅くなりました。
ご指摘の通り、テキストファイル内の"\\\\IPアドレス\\フォルダ名\\ファイル名" を
"\\IPアドレス\フォルダ名\ファイル名" に変えて実行したら出来ました!
助かりました。これで解析が進みます。ありがとうございました!!

お礼日時:2010/08/02 22:58

>>(\\\\IPアドレス\\フォルダ名\\ファイル名)を次々に代入して、


そのコードが記載されていないので確証ありませんがこの部分がうまくいっていない気がします..
どのように書いてます?

この回答への補足

すぐに回答くださり、ありがとうございます。
説明不足ですみません。
filenameにファイル名を格納するのは以下のコードで行っています。
ちなみに下のコードで出てくるfilename018.txtというファイルには、一行ごとに
\\\\192.168.○○.○○\\018\\0001.tif



\\\\192.168.○○.○○\\018\\6400.tif
のような連番のファイル名が保存されています。


(ここからコードです)

FILE *fpp;

errno_t err_a = fopen_s( &fpp, "C:\\Documents and Settings\\user\\My Documents\\Visual Studio 2008\\Projects\\filename_maker\\filename018.txt", "r" );

if (err_a) {
printf_s( "The filename was not opened\n" );
return 1;
}

for (i=0;i<6400;i++) {

 fscanf_s(fpp,"%s",filename,200);
 printf("%s\n",filename); //★

 if( _sopen_s( &fh, filename, _O_RDONLY,_SH_DENYWR,_S_IREAD) == 0 ){
 filesize=_filelength( fh );
 offset=filesize-MX*MY*2;
 printf( "File length : %ld\n", filesize );
 printf( "Offset length : %d\n", offset );
 _close( fh );
}

else {
printf("\n file open error ");
return 1;
}

★で示したprintfではファイル名が正しく表示されるので、格納はできていると思うのですが・・・いかがでしょうか?

補足日時:2010/08/01 01:10
    • good
    • 0

 エラーの場合、_sopen_sはエラー原因をグローバル変数errnoに設定するので、それを調べてください。

あと、filenameにファイル名を格納している部分が書かれていないので、正しく格納されているのかどうかもわかりません。

この回答への補足

すぐに回答くださり、ありがとうございます。
説明不足ですみません。
filenameにファイル名を格納するのは以下のコードで行っています。
下のコードで出てくるfilename018.txtというファイルには、一行ごとに
\\\\192.168.○○.○○\\018\\0001.tif



\\\\192.168.○○.○○\\018\\6400.tif
のような連番のファイル名が保存されています。


(ここからコードです)

FILE *fpp;

errno_t err_a = fopen_s( &fpp, "C:\\Documents and Settings\\user\\My Documents\\Visual Studio 2008\\Projects\\filename_maker\\filename018.txt", "r" );

if (err_a) {
printf_s( "The filename was not opened\n" );
return 1;
}

//*****forでファイル読み込み、計算、強度計算結果の出力を開始*******

for (i=0;i<6400;i++) {

fscanf_s(fpp,"%s",filename,200);
 printf("%s\n",filename); //★

if( _sopen_s( &fh, filename, _O_RDONLY,_SH_DENYWR,_S_IREAD) == 0 ){
filesize=_filelength( fh );
offset=filesize-MX*MY*2;
printf( "File length : %ld\n", filesize );
printf( "Offset length : %d\n", offset );
_close( fh );
}

else {
printf("\n file open error ");
return 1;
}



★で示したprintfではファイル名が正しく表示されるので、格納はできていると思うのですが・・・。
グローバル変数errnoですね、わかりました、勉強しながら調べてみます。

補足日時:2010/08/01 01:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!