这是确切的问题:
编写一个程序,读取文本行,并在读取1,000个字符后将它们附加到char buffer[1000].
停止。在阅读文本时,将所有换行符替换为空终止符。建立一个数组char* lines[100]
,以便该数组中的指针指向文本中行的开头。
如果输入有更多行,则只考虑100个输入行。然后以相反的顺序显示行。从最后一个输入行开始。
// 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--;
}
}
答案 0 :(得分:1)
当您阅读100行时,您的循环不会停止;相反,它继续阅读但停止用\n
替换\0
。结果是您的最后一行“包含”从输入中的第100行开始直到达到1000个字符标记的所有内容。
当你点击第100行的\n
时,你应该终止循环。
附注:
(t = input.get()) != EOF
为t
时, char
不正确(EOF
是int
值,保证与任何{char
不相等1}}转换为int
;转换为char
时,不保证与有效字符不相等。一个简单的input.get(t)
会这样做(它通过引用获取它的参数并返回对流的引用,如果发生错误,其operator bool
将返回false
。
如果您已读取1000个字符,且最后一个字符不是\n
,则最后一个字符串永远不会被\0
关闭。您应该在缓冲区中添加一个额外的字符,以便可以使用\0
关闭该字符串。