2010-11-01 57 views
0

我无法从文件中读取数据,并将数据(文本)的选定部分连接到我自己的缓冲区中。阅读文件时垃圾字符的问题

代码如下所示:

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 

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

+0

问题的地方在哪里? – Svisstack 2010-11-01 12:29:59

+0

不要模糊,成为一个王牌;写一个适当的测试用例! http://tinyurl.com/so-hints http://sscce.org/ http://www.xs4all.nl/~weegen/eelis/iso-c++/testcase。xhtml – 2010-11-01 12:31:14

+2

不要使用[!eof()](http://stackoverflow.com/questions/3771754/what-is-an-efficient-way-of-back-tracking-in-greedy-best-search-algorithm/3773087#3773087)。 – 2010-11-01 12:31:51

回答

10

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

用途:

allNewData[0] = '\0'; 

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

而且,您的代码需要当涉及到I/O和处理记忆,更好地采取各种“陷阱”的护理:

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

展开,我认为你的第一个选项是正确的(+1 btw),否则它会在每个输入行之前清空缓冲区。 OP似乎希望整个文件连接在一起。 – paxdiablo 2010-11-01 12:34:01

+0

@paxdiablo:注意到,并且已经删除了替代品的提及。 :) 谢谢。 – unwind 2010-11-01 12:35:42

0

再次组合......你必须检查你的IO操作不会失败和eof()只能失败的IO操作后使用。

1

一些评论,这可能对您有用或漠视:

  1. 如果有一个行超过1000个字符长? (并且说1001-1008是'blah blah')?该行会在你的新文件中被拆分为两行,并且在“这里是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; 
    } 
    } 

这样你就不必担心以上任何问题...