• 締切済み

_tfopen について教えてください

D-Matsuの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

アンセーフコードが戻り値でFILE *を得られるのに対してセーフコードでは引数でなければ得られないのですから、当然FILE *を一旦何らかの変数に格納する手順が要る訳です。 従って#1お礼のコードで少なくとも正常系は間違っていない(本当は戻り値のerrnoを確認する必要がある)のですが、もともとこれらの関数はVisual C++独自関数なので移植性はありません。 弊害といえばそんなもんでしょう。

psychang
質問者

お礼

アドバイス頂きありがとうございます! お礼が遅れてすみません。 #1 の方もご回答ありがとうございました。

関連するQ&A

  • C++Bulder2010の_wfopenについて

    C++Bulder2010は、今までの知識が通用しない、という嫌な予感があって買ったきり試していませんでした。 試しに使ってみたのですが、案の定、結構初歩的なところで引っかかってしまいました。 ファイルのOPENですが、従来は、 if((fp1=fopen(InpFL,"r")) == NULL) { と記述していました。 それを、 wchar_t InpFL[256]; if((fp1=_wfopen(InpFL,"r")) == NULL) { と修正したのですが、HELPでプロトタイプを見ると、 FILE *_wfopen(const wchar_t *filename, const wchar_t *mode); とあります。 第二引数の const wchar_t *mode ですが、ここをどの様に指定したらよいか分かりません。 申し訳ありませんが、どなたかご指導ください。

  • エラーチェック、ファイルに特定の文字列があったらエラーの処理を出したい。

    たびたび質問すいません。 エラーチェックについて質問です。 sub err_check{ $data="data.txt"; open(LOG,"$data"); @readerlist = <LOG>; close(LOG); foreach $list (@readerlist) { $newlist = $list; $newlist =~ s/\n//g; $newlist =~ s/\r//g; if($newlist eq $mail) {&err("$mail は既に登録済みです");} } } という記述は動作しました。この逆、$mailは登録されていませんというエラー処理を吐き出すには、($newlist eq $mail)を($newlist ne $mail)とやればできるのかと思いましたがうまくいきませんでした。 data.txtの中身はメールアドレスですが、アドレスごとに改行コード↑が入ります。data.txtのファイルの中身を検索して、$mailがなかったら登録してません。と はきだす処理の記述はどのようにしたらいいのでしょうか?

    • ベストアンサー
    • Perl
  • UNICODEファイルが文字化けする

    どうしてもうまくいかず質問致します。 Visual Studio2008のMFCで、下記のコードでUnicodeファイルを読み込むと、文字化けします。  なぜでしょうか? 文字セットは、Unicodeにしています。 ログを調べているとsetlocaleや_wsetlocaleを使うとうまくいっているようですが、この環境では 解決しません。 CFileDialog seldel(TRUE, NULL,NULL, OFN_HIDEREADONLY,NULL); if(seldel.DoModal()==IDOK) { CString cpath=seldel.GetPathName(); CStdioFile cFile; cFile.Open(cpath,CFile::modeRead | CFile::shareDenyNone);// == FALSE) CString cs, cs_all; while(cFile.ReadString(cs)==TRUE) { cs_all+=cs; } ::AfxMessageBox(cs_all); } どうぞよろしくお願い致します。

  • ファイルの入出力でのテキスト モードでの変換について

    今までとりあえずサクサク骨組み作りたいので、短くかけるためマルチバイト文字主体で来たのですが ここらへんでUnicode文字のことが気になってきたので、以下のような関数を基本にしてプロパティやコードをいじったりしつつ入出力を色々試してみたのですが… (エラー時の処理とか省略します。) #include <TCHAR.h> #include <stdio.h> #include <locale.h> #ifdef _UNICODE #define 文字セット "Unicodeを使用" #else #define 文字セット "マルチバイトを使用" #endif void f(){ _tsetlocale(LC_ALL, _T("japanese")); FILE *fp; if ( _tfopen_s( &fp, _T("exp.txt"), _T("wb") ) ) return; _ftprintf( fp ,_T(文字セット)); fclose(fp); } ファイルサイズや出力内容を見てみると、Unicode文字を使う場合、このようにバイナリモードで書き込みをすると、バイト数が、単純にsizeof(wchar_t)*文字数になってしまうようで 気になったので調べてみると、こういうことみたいですね。 http://msdn.microsoft.com/ja-jp/library/c4cy2b8e%28VS.80%29.aspx 最後の方に >Unicode ストリーム入出力関数をバイナリ モードで実行すると、ファイルが Unicode であると想定されるため、入出力時に CR-LF 変換も文字変換も行われません。 と書いてありますが これは、ただしつまり Unicodeを扱う場合でも、結局バイナリモードで出力したらバイナリモードで入力すれば正しい同じデータが得られるし、テキストモードで出力したらテキストモードで入力すれば大丈夫と考えて良いですよね? 言い換えれば、少なくともUnicodeでテキストモードだと、CR-LF 変換と文字変換が行われてしまうということで (少なくともマルチバイトなら文字変換はなしでしょうが) 「文字変換」については今回初めて知りました。 他にはマルチバイト・Unicode問わず、テキストモードを使用すると、何か変換が行われる可能性はあるのでしょうか?

  • definedの使い方が間違ってますか?

    こんばんは。 色々試してみたのですが、どうしてもうまくいかないので質問させてください。 リストの$f1とファイルの$aaがマッチして、 かつリストの$f3とファイルの$bbがマッチした場合に、 $f4を付け加えてprintしたいのですが、 ★マークの処理で、リストの$f3とファイルの$bbがマッチしていないものまで printされてしまうことがあります。 $aaとマッチするものがリストに2つ以上ある時にこの現象がおきるようなのですが、 どの辺を直したらよいのかわかりません。 definedの使い方がおかしいのでしょうか? 見よう見まねで書いたので、▲マークあたりの指定も自信がありません。 #リスト読み込み open LIST, "./list" or die; while (<LIST>) { chomp; if (/(.*) (.*) (.*) (.*)/) { $f1 = $1; $f2 = $2; $f3 = $3; $f4 = $4; } $xx{$f1} = $f4; #▲ $yy{$f1} = $f3; #▲ } close LIST; #ファイル読み込み if ($#ARGV >= 0) { @files = @ARGV; } foreach $file (@files) { open FILE, $file; while (<FILE>) { chomp; if (/^([^t]+)\t(.*)$/) { $aa = $1; $bb = $2; if (defined($xx{$aa})) { if (defined($yy{$bb})) { # ★ print "$aa\t$bb\t\#【$xx{$aa}】\n"; } } } } close FILE; } どうかご教示お願いいたします。

    • ベストアンサー
    • Perl
  • 標準出力をDOS窓を開かずにファイルに書き込む方法

    VC++(Console Appli)です。 あるコマンドの標準出力結果をファイルに吐き出す方法として、 単純には、 system("cmnd > C:\\temp.txt"); とやれば実現できますが、このとき、一瞬ですが、DOS窓の黒枠が表示されます。 このDOS窓を出さないで済む方法があれば教えてください。 標準出力を何らかの方法で受け取って、 ------------------------------------------------- CString str; CStdioFile file;   :  cmndの標準出力結果をstrへ内部的に受け取らせる。   : file.Open(_T("c:\\temp.txt"), CFile::modeWrite); file.WriteString(str); file.Close(); ------------------------------------------------- などで簡単に出来れば良いのですが・・よろしくお願いします。

  • 関数の中から別の関数内のforeachの実行結果を得られない

    お世話になります。 環境 perl 5.8.0 RHLinux9 以下のようにsub _Htmlからsub _List1を呼び出す場合は正常にリスト表示できるのですが、sub _List2を呼び出した場合、 Content-Type: text/html <HTML lang=ja > <HEAD>...として表示されてしまいます。 sub _List1{ @list = (0, 1, 2, 3, 4, 5); foreach (@list) { print "$_\n"; } } sub _List2{ $a1 = "./dir/data.dat"; $a2 = "./dir/data.dat"; $a3 = "./dir/data.dat"; &FileOpen('FILE1',"$a1"); &FileOpen('FILE2',"$a2"); &FileOpen('FILE3',"$a3"); @DATA = <FILE1>; push @DATA, <FILE2>,<FILE3>; close(FILE1); close(FILE2); close(FILE3); foreach (@DATA) { ($key,$val)=split(/=/,$_); print "$key=$val"; $StartNum++; } } sub _Html{ print <<EOM; <table> <tr><td> .. EOM &_List(''); print <<EOM; <tr><td> .. </table> EOM } sub _List2の内容を、CGIからhtmlを表示する際のスキン.htmlファイル内に下記のように記述した場合も 正常にリスト表示されます。 --スキン.html------ print <<"<!---HTML--->"; <HTML lang=ja > <HEAD>... <!---HTML---> $a1 = "./dir/data.dat"; $a2 = "./dir/data.dat"; $a3 = "./dir/data.dat"; &FileOpen('FILE1',"$a1"); &FileOpen('FILE2',"$a2"); &FileOpen('FILE3',"$a3"); @DATA = <FILE1>; push @DATA, <FILE2>,<FILE3>; close(FILE1); close(FILE2); close(FILE3); foreach (@DATA) { ($key,$val)=split(/=/,$_); print "$key=$val"; $StartNum++; } } print <<"<!---HTML--->"; ... </BODY></HTML> <!---HTML---> 1; ---

    • ベストアンサー
    • Perl
  • Unicodeのテキストファイルを読みたい

    Unicode(UTF-8)で作成されたテキストファイルを読み、Shift-JISに変換しメモコントロールに表示したいと思っています。 以下のコードで実行したのですが、文字化けになり正常に表示できません。 開発環境はC++Builder2010です。 char sjis[300]; wchar_t buf[300]; size_t n; setlocale(LC_ALL,"japanese"); while(fgetws(buf,300,fp31) != NULL){ n = wcstombs(sjis,buf,300); Memo1->Lines->Add(sjis); } fgetws関数が問題なのか、wcstombs関数が問題なのか、不明なのです。 アドバイスよろしくお願いいたします。 ちなみに読込んだテキストファイルは、国税局のインボイス登録者データです。 https://www.invoice-kohyo.nta.go.jp/download/index.html

  • Unicode規定の Zs (space separator) とは

    Unicode規定の Zs (space separator) とは ECMA262 Edition 5 規定の String.prototype.trim() を未対応ブラウザ用に実装しようとしています。 仕様には「WhiteSpace, LineTerminator を取り除く」との記述がありました。 ------- 15.5.4.20 String.prototype.trim() ...(中略)... 3. Let T be a String value that is a copy of S with both leading and trailing white space removed. The definition of white space is the union of WhiteSpace and LineTerminator. http://www.ecma-international.org/publications/standards/Ecma-262.htm ------- WhiteSpace, LineTerminator はそれぞれ「7.2 White Space」「7.3 Line Terminators」で定義されており、概ね理解しましたが、WhiteSpaceで定義されている「Zs」の文字が何であるか、で詰まりました。 Zs は表で記述されていますが、該当部だけ引用すると次のように書かれています。 (表をテキストで書くのは難しいのでフォーマットを変えています) ------- 7.2 White Space ...(中略)... [Code Unit Value] Other category "Zs" [Name] Any other Unicode "space separator" [Formal Name] <USP> ECMAScript implementations must recognize all of the white space characters defined in Unicode 3.0. Later editions of the Unicode Standard may define other white space characters. ECMAScript implementations may recognize white space characters from later edition of the Unicode Standard. http://www.ecma-international.org/publications/standards/Ecma-262.htm ------- 機械翻訳を頼りに翻訳してみたところでは、「Unicode 3.0 定義の空白文字」と「最新の Unicode 定義の空白文字」を認識しなければならない、と読めました。 Unicode Consortium http://www.unicode.org/ 公式サイトらしき場所は発見しましたが、ここからどこを読めば Zs (space separator) が確認できるのか、がわかりません…。 (ぐぐってみると、それらしき情報がHITするのですが、できれば公式文書で確認したいと思っています。) JavaScript, Regex, and Unicode http://blog.stevenlevithan.com/archives/javascript-regex-and-unicode Unicode Characters in the 'Separator, Space' Category http://www.fileformat.info/info/unicode/category/Zs/list.htm unicode.org のどこに Zs (space separator) に関する記述があるのでしょうか? # 英語サイトに関する質問なので [英語] カテゴリにすべきか迷いましたが、内容は専門的な事なので [JavaScript] カテゴリとしました。 # 問題があるようでしたら、別の形で再質問したいと思います。

  • テキストファイルの日付表示

    JAVA初心者なのですが、テキストファイルに出力する時にファイル名を現在日付にしたいのですが、どうすればよいでしょうか?(yyyymmdd.txtを20070316.txtというふうにしたい) 後、@SuppressWarnings("unchecked")と記述しているのにコンパイルで-Xlint:unchecked.警告が出てきてします!どなたかご教授ください!!ちなみにJAVA1.5 import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; import java.util.ArrayList; public class Writedown { @SuppressWarnings("unchecked")/*コンパイラの警告を抑制する */ public static void fileWrite(ArrayList<ArrayList> WriteArrayList) { try { File txt = new File("yyyymmdd.txt"); /*出力するファイル*/ BufferedWriter bw = new BufferedWriter(new FileWriter(txt));/* try { for(int i = 0; i < WriteArrayList.size(); i++){ ArrayList list = WriteArrayList.get(i); if(i == 0){ bw.write((list.size() - 3) + "科目成績表\r\n"); } for(int j = 0; j < list.size(); j++){ if(j > 0){ bw.write("\t"); } if(list.get(j).toString().equals("名前")){ list.remove(j); list.add(j,"名前"); } bw.write(list.get(j).toString()); System.out.print(list.get(j) + "\t"); } bw.write("\r\n"); bw.flush(); System.out.println(""); } } catch (IOException e) { System.out.println("ファイル書き込みエラー"); } bw.close(); } catch (IOException e) { System.out.println("ファイルオープンエラー"); } } }