【问题标题】:Problems with garbage characters when reading file [closed]读取文件时出现乱码问题[关闭]
【发布时间】:2010-11-01 12:26:48
【问题描述】:

我无法从文件中读取数据,并将数据(文本)的选定部分连接到我自己的缓冲区中。

代码如下:

 char buffer[1000];
  char* allNewData = (char *)malloc(10000);

  while (! myfile.eof() )
  {
   myfile.getline (buffer, 1000);
   pch = strstr (buffer,"bla bla");
   if(pch == NULL)
   {
    char* temp = buffer;
    strcat(allNewData, temp);
    strcat(allNewData, "\n");
   }
   else
   {
    strcat(allNewData, "here's bla bla");
    strcat(allNewData, "\n");
   }
  }

  cout<<allNewData<<endl;

当我运行程序时,allNewData 首先有一些垃圾文本,然后是正确/预期的结果,如下所示:

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii <-rubbish data
hello  <- actual data

我需要摆脱这些垃圾数据,我该如何更改代码来实现呢?

【问题讨论】:

标签: c++ stream


【解决方案1】:

在使用字符串连接函数之前,您需要清除新分配的缓冲区。他们期望一个有效的字符串,能够找到连接的结尾,从而找到连接的开始。

用途:

allNewData[0] = '\0';

这会使 allNewData 变成一个空字符串。在开始连接所有找到的数据之前,在循环之前执行此操作。

此外,当涉及到 I/O 和处理内存时,您的代码需要更好地处理各种“陷阱”:

  • 在执行读取访问之前不要检查 EOF。
  • 在使用读取结果之前检查读取是否成功。
  • 确保在存储数据时不要超出缓冲区的容量。

【讨论】:

  • 展开,我认为您的第一个选项是正确的(+1 btw),否则它将在每个输入行之前清空缓冲区。 OP 似乎希望将整个文件连接起来。
  • @paxdiablo:注意到,并且已经删除了替代方案的提及。 :) 谢谢。
【解决方案2】:

一些 cmets,您可能会觉得有帮助或无视:

  1. 如果一行超过 1000 个字符怎么办? (比如说,1001-1008 是“等等等等”)?该行将在您的新文件中分成两行,并且在“here's blah blah”之前会有一个额外的行?这现在是错误还是需要的功能?
  2. 如果行长超过 1000,但“blah”是 996-1000,而第二个“blah”在第二段 - 现在您已经丢失了一个,该怎么办?
  3. 如果您的文件长度超过 10000 个字符怎么办?

它们可能听起来像微不足道的问题,但正确回答它们将意味着你必须改变你的方法,我建议更纯粹的 C++ 方法:

  ifstream f_in(<file>);
  ostringstream s_out;
  string line;
  while(f_in.good())
  {
    getline(f_in, line); // global getline function in <string>
    if (line.find("blah blah") != string::npos)
    {
      s_out << "here's blah blah" << endl;
    }
    else
    {
      s_out << line << endl;
    }
  }

这样你就不用担心上面的任何问题了……

【讨论】:

    【解决方案3】:

    您还可以使用getlineignore 的组合

    【讨论】:

      【解决方案4】:

      再次...您必须检查您的 IO 操作是否失败,并且应仅在 IO 操作失败后使用eof()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-12
        相关资源
        最近更新 更多