读取文件时出现乱码问题

时间:2010-11-01 12:26:48

标签: c++ stream ignore skip

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

代码如下:

 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

我需要摆脱这些垃圾数据,如何更改代码才能实现这一目标?

4 个答案:

答案 0 :(得分:10)

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

使用:

allNewData[0] = '\0';

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

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

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

答案 1 :(得分:1)

您可能会发现一些有用或无视的评论:

  1. 如果有超过1000个字符的行怎么办? (并说,1001-1008是'等等')?该行将在您的新文件中拆分为两行,并且在“这里的等等”之前会有一条额外的行?这现在是一个错误或所需的功能吗?
  2. 如果该行长于1000,但“blah”为996-1000而第二段“blah”在第二段上,那么该怎么办?现在你已经失去了一个
  3. 如果您的文件超过10000个字符怎么办?
  4. 它们可能听起来像是微不足道的问题,但正确回答它们意味着你必须改变你的方法,我建议更纯粹的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;
        }
      }
    

    这样您就不必担心上述任何问题......

答案 2 :(得分:0)

您还可以使用getlineignore

的组合

答案 3 :(得分:0)

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