user2859884
user2859884

Reputation: 35

VC6 /r/n and Write works; Visual Studio 2013 does not work

the following code

    if(!cfile.Open(fileName, CFile::modeCreate | CFile::modeReadWrite)){
        return;
    }

    ggg.Format(_T("0    \r\n"));
    cfile.Write(ggg, ggg.GetLength()); 
    ggg.Format(_T("SECTION  \r\n"));
    cfile.Write(ggg, ggg.GetLength()); 

produces the following: 0 SECTI

clearly this is wrong: (a) \r\n is ignored, and (b) the word SECTION is cut off.

Can someone please tell me what I am doing wrong?

The same code without _T() in VC6 produces the correct results.

Thank you a.

Upvotes: 0

Views: 111

Answers (2)

Michael Petch
Michael Petch

Reputation: 47593

Have you considered changing lines like:

cfile.Write(ggg, ggg.GetLength()); 

to`

cfile.Write(ggg, ggg.GetLength() * sizeof(TCHAR))

Write needs the number of bytes (not characters). Since Unicode is 2 bytes wide you need to account for that. sizeof(TCHAR) should be the number of bytes each character takes on a given platform. If it is built as Ansi it would be 1 and Unicode would have 2. Multiply that by the string length and the number of bytes should be correct.

Information on TCHAR can be found on MSDN documentation here. In particular it is defined as:

The _TCHAR data type is defined conditionally in Tchar.h. If the symbol _UNICODE is defined for your build, _TCHAR is defined as wchar_t; otherwise, for single-byte and MBCS builds, it is defined as char. (wchar_t, the basic Unicode wide-character data type, is the 16-bit counterpart to an 8-bit signed char.)

TCHAR and _TCHAR in your usage should be synonymous. However I believe these days Microsoft recommends including <tchar.h> and using _TCHAR. What I can't tell you is if _TCHAR existed on VC 6.0.

If using the method above - if you build using Unicode your output files will be in Unicode. If you build for Ansi it will be output as 8bit ASCII.

Want CFile.write to output Ascii no matter what? Read on...

If you want all text written to the file as 8bit ASCII you are going to have to use one of the macros for conversion. In particular CT2A. More on the macros can be found in this MSDN article. Each macro can be broken up by name, however CT2A says convert the Generic character string (equivalent to W when _UNICODE is defined, equivalent to A otherwise) to Ascii per the chart at the link. So no matter whether using Unicode or Ascii it would output Ascii. Your code would look something like:

ggg.Format(_T("0    \r\n"));
cfile.Write(CT2A(ggg), ggg.GetLength());
ggg.Format(_T("SECTION  \r\n"));
cfile.Write(CT2A(ggg), ggg.GetLength());

Since the macro converts everything to Ascii CString's GetLength() will suffice.

Upvotes: 0

Igor Tandetnik
Igor Tandetnik

Reputation: 52581

Apparently, you are building a Unicode build; CString (presumably that's what ggg is) holds a sequence of wchar_t characters, each two bytes large. ggg.GetLength() is the length of the string in characters.

However, CFile::Write takes the length in bytes, not in characters. You are passing half the number of bytes actually taken by the string, so only half the number of characters gets written.

Upvotes: 1

Related Questions