67352


MFCを使っていますが、CFileのOpenでオプションにCFile::typeTextを指定するとエラーになってしまいます。

[code]

    BOOL CMFCApplication5Dlg::OnInitDialog()
    {
    //~~~~~中略~~~~~~//
        CFile file;
        file.Open(_T("test.txt"), CFile::modeCreate | CFile::modeWrite | CFile::typeText); //ここでエラー
        file.Close();
    
        return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
    }
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/FW2hr.png)](https://i.stack.imgur.com/FW2hr.png)

何のエラーなのかもわからないし、ネットで「CFile::typeText」で検索しても出てきません。  
ちなみに、CFile::typeTextの部分をCFile::typeBinaryに変えるとうまくいきます。

どなたかわかるかたいらっしゃったらご教授いただけないでしょうか。


CC BY-SA 4.0
2020-06-06T03:31:02.700
67347
2020-06-06T07:00:51.083
2020-06-06T04:53:02.027
4236
38241
question
mfc
CFileのOpenでオプションにCFile::typeTextを指定するとエラーになる


エラーメッセージの該当ソース(filecore.cppの176行)を見ると、以下のようになっています。

>
[code]

>     ASSERT((nOpenFlags & typeText) == 0);   // text mode not supported
>  
[/code]

ちなみに`ネットで「CFile::typeText」で検索しても出てきません。`については、Microsoftのドキュメントサイトの説明で以下のように記述されています。(引用中の太字は引用者)  
[CFile::Open](https://docs.microsoft.com/en-us/cpp/mfc/reference/cfile-
class?view=vs-2019#open)

> Overloaded. `Open` is designed for use with the default `CFile` constructor.
>
> nOpenFlags  
>  A UINT that defines the file's sharing and access mode. It specifies the
> action to take when opening the file. You can combine options by using the
> bitwise-OR ( | ) operator. One access permission and one share option are
> required; the `modeCreate` and `modeNoInherit` modes are optional. **See
> the[CFile](https://docs.microsoft.com/en-us/cpp/mfc/reference/cfile-
> class?view=vs-2019#cfile) constructor for a list of mode options.**

[CFile::CFile](https://docs.microsoft.com/en-us/cpp/mfc/reference/cfile-
class?view=vs-2019#cfile)

>
[code]

>     Choose one of the following character mode options.
>     Value              Description
>     CFile::typeBinary  Sets binary mode (used in derived classes only).
>     CFile::typeText    Sets text mode with special processing for carriage
> return-line feed pairs (used in derived classes only).
>     CFile::typeUnicode Sets Unicode mode (used in derived classes only).
> Text is written to the file in Unicode format
>                        when the application is built in a Unicode
> configuration. No BOM is written to the file.
>  
[/code]

いずれのフラグも説明上は`(used in derived classes
only)`(派生クラスでのみ使用)となっていますが、ソース上でASSERTのチェック対象になっているのは`CFile::typeText`のみでした。  
`CFile::typeBinary`に至っては181,182行で以下のように明確に無視されるようになっていました。

>
[code]

>     // CFile objects are always binary and CreateFile does not need flag
>     nOpenFlags &= ~(UINT)typeBinary;
>  
[/code]

**つまり`CFile`クラスを使用する場合は、仕様上は`CFile::typeXxxx`のフラグは(`CFile::typeBinary`も含めて)いずれも使用するべきではない、と考えられます。**  
ただし、偶々なのか何かの理由があるのかもしれませんが、`CFile::typeText`だけが明確にチェック対象になっているということでしょう。

以下の階層図で`CFile`から派生したクラスでならば`CFile::typeXxxx`のフラグを使えるのだと思われます。  
[階層図](https://docs.microsoft.com/ja-jp/cpp/mfc/hierarchy-chart?view=vs-2019)


CC BY-SA 4.0
2020-06-06T06:52:19.913
67352
2020-06-06T07:00:51.083
2020-06-17T08:14:45.997
-1
26370
67347
answer