【问题标题】:MSVC++ 2008 text file parsing difference between win7 <-> xpMSVC++ 2008 文本文件解析 win7 <-> xp 之间的区别
【发布时间】:2011-12-20 03:48:55
【问题描述】:

工作环境

  • Windows 7 Ultimate X64 SP1
  • Microsoft Visual Studio 2008 SP1 (C++)

文本文件

我的程序正在解析纯文本文件并运行。下一个代码是那个文本文件。

/*main.txt*/

_function main()
{
    a = 3;      //a is 3
    b = "three";
    c = 4.3;    //automatic typecast
    _outd(b+"3\n");
    _outd(b+a+c);
    d = a/c;
    _outd("\n"+d+"\n"); ///test commantation
    /*//
    comment
    */
}

它是一种简单的 c 样式脚本,可在记事本等文本编辑器中编辑。(此文本中的内容不重要)

代码

文本打开代码。

std::wstring wsFileName; //from 

char* sz_FileName = new char[wsFileName.size()+1];
ZeroMemory(sz_FileName,sizeof(char)*(wsFileName.size()+1));

//////////////////////////////////////////////////////////////////////////
//for using 'fopen', change wsFileName to ascii
WideCharToMultiByte(CP_UTF8,0,wsFileName.c_str(),-1,sz_FileName,wsFileName.size(),NULL,NULL);

//open ascii text file
FILE* fp=fopen(sz_FileName,"rt");

std::string ch;
while(!feof(fp))
{
     ch.push_back(fgetc(fp));   //get textfile in ascii
}

问题

在调试器中观看std::string ch

这与我在 Windows 7 中的预期结果完全相同。发布的执行文件也可以正常工作。但在 Windows XP SP3 中,它会调用运行时错误。

我挖了一个晚上,终于找到了。我在windows xp sp3上安装了visual studio 2008 sp1并进行了调试。

关注std::string ch

我猜“换行符”是该程序在 windows xp 中崩溃的原因。我猜到这个问题基于'windows 7和windows xp之间的文本编码'。所以我使用 windows xp 的记事本制作新的脚本文本。并尝试解析它。但是windows xp也有同样的问题。我知道:这个问题不仅出现在 windows 7 的文本文件中,而且还出现在 windows xp 中新生成的文本中。我不知道为什么会出现问题。

问题

一个纯文本文件(由记事本、editplus、ultraedit 和其他...生成)生成任何 Windows 操作系统(xp 和 vista 和 7),我的程序如何读取相同的文本结果?
我希望每个用户都可以使用他们自己的简单文本编辑器编辑脚本以在他们自己的操作系统中控制和自定义我的程序。

【问题讨论】:

  • -1 那篇文章非常难以阅读。请修复它;我已经完成了一些工作。标题也需要调整。
  • 感谢您注意如何编写标题。并且 a, b, c.. 不是 c++ 源代码。它是我的程序的自定义脚本。本文的主要问题是“文本解析”。脚本文本的内容不是重要的部分。

标签: c++ windows visual-studio text fopen


【解决方案1】:

如果字符包含不需要的字符,为什么不在添加到字符串之前测试它?例如。类似:

char temp;
while(...)
{
  temp = fgetc(fp);
  if (temp != "\r")
    ch.push_back(temp);
}

我还没有测试过代码,但如果“错误”字符确实是“\r”,它应该可以工作。

【讨论】:

  • @Spo1ler 不,这取决于 ch 的初始化方式。因为这不是问题的一部分,所以我没有回答。为了避免内存重新分配,只需使用 ch.reserve(filesize) 设置字符串大小,o 获取文件大小有几种不同的方法是可能的。而且由于在问题中使用了类似的方法并且没有显示 ch 的声明,我只是假设这已经完成了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2014-09-27
  • 1970-01-01
  • 2013-09-02
  • 2012-04-07
  • 1970-01-01
相关资源
最近更新 更多