将前1000个字符的文件读入缓冲区,将换行符转换为\ 0并将字符串地址位置存储到char * []

时间:2014-05-11 02:52:45

标签: c++ ifstream

这是确切的问题:

编写一个程序,读取文本行,并在读取1,000个字符后将它们附加到char buffer[1000].停止。在阅读文本时,将所有换行符替换为空终止符。建立一个数组char* lines[100],以便该数组中的指针指向文本中行的开头。

如果输入有更多行,则只考虑100个输入行。然后以相反的顺序显示行。从最后一个输入行开始。

Data.txt的内容:

http://pastebin.com/uKv4nC5s

我的代码:

// see updated code

我的问题

当与上面指定的Data.txt文件一起使用时,上述功能完美无缺;但是,当文件包含>时,它很糟糕。 100行文字。

当它以反向读回内容时,第一行打印的是第100行之后的所有内容。

考虑我们有以下最后四行

99   ASDF  
100  FFFF  
101  3910  
102  FKDS 

上面会打印

FFFF // GOOD 
3910 // NOT GOOD
FKDS // NOT GOOD PART DEUX
ASDF // GOOD

我相信所需的输出是它忽略了第100个换行符或第1000个字符之后的所有内容,以先到者为准。

非常感谢任何正确方向的指示或指导。这是家庭作业所以如果可能的话,没有明确的答案。

更新代码:

void read_and_print()
{
    std::ifstream input("D:\\data.txt");

    if (!input.is_open() || !input.good())
        return;

    char buffer[10001];
    int b = 0;

    char* lines[100];
    int l = 0;
    char** e;
    bool set_start = false;

    lines[l] = buffer + b; // the first line
    e = lines + (l++);

    char t;
    while (input.get(t) && b < 1000)
    {
        if (set_start)
        {
            if (l < 100) {
                lines[l] = buffer + b;
                e = lines + l;
            }
            l++;
            set_start = false;
        }

        if (t == '\n') {
            t = '\0';
            set_start = !set_start;
        }

        buffer[b] = t;
        b++;
    }

    input.close();

    if (b == 1000)
        buffer[1000] = '\0'; // close out the string
    else if (b < 1000)
        buffer[b] = '\0'; // close out the string

    while (lines <= e)
    {
        std::cout << *e << std::endl;
        e--;
    }
}

1 个答案:

答案 0 :(得分:1)

当您阅读100行时,您的循环不会停止;相反,它继续阅读但停止用\n替换\0。结果是您的最后一行“包含”从输入中的第100行开始直到达到1000个字符标记的所有内容。

当你点击第100行的\n时,你应该终止循环。

附注:

    (t = input.get()) != EOFt时,
  • char不正确(EOFint值,保证与任何{char不相等1}}转换为int;转换为char时,不保证与有效字符不相等。一个简单的input.get(t)会这样做(它通过引用获取它的参数并返回对流的引用,如果发生错误,其operator bool将返回false

  • 如果您已读取1000个字符,且最后一个字符不是\n,则最后一个字符串永远不会被\0关闭。您应该在缓冲区中添加一个额外的字符,以便可以使用\0关闭该字符串。