none
vc++输出txt文本中如何换行? RRS feed

  • 问题

  • CFile cfile(_T("圆曲线要素.txt"),CFile::modeCreate | CFile::modeWrite);
     CArchive ar(&cfile, CArchive::store);
     int m = 0;
     for (m = 0; m < i; m++)
     {
      ar << sum[m];
      //ar.WriteString(sum[m]);
      //ar.WriteString(_T("\r\n"));

     }

    输出到文本中无法换行,改成和  ar << sum[m]<<"\r\n";和ar<<sum[m]<<"000D"<<"000A";都不换行,请问该怎么办?

      
    2015年1月28日 2:09

答案

  • 具体我不是很了解, 刚刚尝试了一下, 一起讨论讨论.

    CArchive.WriteString()函数是用来写一行字符串的, 因此如果你把\n放在字符串末尾是可以成功换行的.

    若将\n至于字符串中间写入文件, 使用记事本查看文件, 其中并不会出现换行的情况,

    但实际上你再次使用CArchive.ReadString() 读取一行只能读取\n前面的内容. 因此可以看出, '\n'是成功写入了的, 但是在记事本中是以不可见的空白字符存在. 事实上, 如果你把记事本中的所有字符复制到另一个编辑环境(如vs)中, 就可能会出现换行了.

    序列化写入:

    	CFile file(_T("t.txt"), CFile::modeCreate | CFile::modeWrite);
    	CArchive ar(&file, CArchive::store);
    
    	ar.WriteString(_T("Line1\n Line2")); // 文件内容是"Line1 Line2"
    
    	ar.Close();
    	file.Close();

    序列化读取:

    	CFile file(_T("t.txt"), CFile::modeRead);
    	CArchive ar(&file, CArchive::load);
    
    	CString cstr;
    	ar.ReadString(cstr);	//读取之后, cstr的值为"Line1"
    
    	ar.Close();
    	file.Close();

    小问一下, 如果是把字符串写到文件中, 为什么要用序列化的方式呢, 直接用文件读写不是更好吗?

    • 已建议为答案 Lymim 2015年1月30日 9:42
    • 已标记为答案 Shu 2017 2015年2月9日 2:50
    2015年1月28日 9:32
  • 直接这样就可以了:
            try
    	{
    		CFile file(_T("F:\\11.txt"), CFile::modeCreate | CFile::modeWrite);
    		char szText[] = "Hello, World!";
    		char szBuf[] = {'\0', '\r', '\n', '\0'};
    		for(size_t i = 0; i != strlen(szText); ++i)
    		{
    			szBuf[0] = szText[i];
    			file.Write(szBuf, strlen(szBuf) * sizeof(char));
    		}
    		file.Close();
    	}
    	catch (CException* e)
    	{
    		e->ReportError();
    		e->Delete();
    	}


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已建议为答案 Lymim 2015年1月30日 9:42
    • 已标记为答案 Shu 2017 2015年2月9日 2:50
    2015年1月29日 1:34
    版主

全部回复

  • 具体我不是很了解, 刚刚尝试了一下, 一起讨论讨论.

    CArchive.WriteString()函数是用来写一行字符串的, 因此如果你把\n放在字符串末尾是可以成功换行的.

    若将\n至于字符串中间写入文件, 使用记事本查看文件, 其中并不会出现换行的情况,

    但实际上你再次使用CArchive.ReadString() 读取一行只能读取\n前面的内容. 因此可以看出, '\n'是成功写入了的, 但是在记事本中是以不可见的空白字符存在. 事实上, 如果你把记事本中的所有字符复制到另一个编辑环境(如vs)中, 就可能会出现换行了.

    序列化写入:

    	CFile file(_T("t.txt"), CFile::modeCreate | CFile::modeWrite);
    	CArchive ar(&file, CArchive::store);
    
    	ar.WriteString(_T("Line1\n Line2")); // 文件内容是"Line1 Line2"
    
    	ar.Close();
    	file.Close();

    序列化读取:

    	CFile file(_T("t.txt"), CFile::modeRead);
    	CArchive ar(&file, CArchive::load);
    
    	CString cstr;
    	ar.ReadString(cstr);	//读取之后, cstr的值为"Line1"
    
    	ar.Close();
    	file.Close();

    小问一下, 如果是把字符串写到文件中, 为什么要用序列化的方式呢, 直接用文件读写不是更好吗?

    • 已建议为答案 Lymim 2015年1月30日 9:42
    • 已标记为答案 Shu 2017 2015年2月9日 2:50
    2015年1月28日 9:32
  • 直接这样就可以了:
            try
    	{
    		CFile file(_T("F:\\11.txt"), CFile::modeCreate | CFile::modeWrite);
    		char szText[] = "Hello, World!";
    		char szBuf[] = {'\0', '\r', '\n', '\0'};
    		for(size_t i = 0; i != strlen(szText); ++i)
    		{
    			szBuf[0] = szText[i];
    			file.Write(szBuf, strlen(szBuf) * sizeof(char));
    		}
    		file.Close();
    	}
    	catch (CException* e)
    	{
    		e->ReportError();
    		e->Delete();
    	}


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已建议为答案 Lymim 2015年1月30日 9:42
    • 已标记为答案 Shu 2017 2015年2月9日 2:50
    2015年1月29日 1:34
    版主