gpt4 book ai didi

c++ - 如何在文件中用 Bye 替换 Hi

转载 作者:行者123 更新时间:2023-11-30 01:01:32 25 4
gpt4 key购买 nike

我想通过读取一个文件并用替换后的字母输出另一个文件来用 bye 替换 hi。

#include <iostream>
#include <fstream>
using namespace std;

int main() {
ifstream myfile;
ofstream output;
output.open("outputfile.txt");
myfile.open("infile.txt");
char letter;
myfile.get(letter);
while (!myfile.eof()) {
if (letter == 'H') {
char z = letter++;
if (z == 'i')
output << "BYE";
}
else output << letter;
}

output.close();
myfile.close();
return 0;
}

我的输出是重复大写的 I's 重复无限次。

这是我的输入文件

Hi
a Hi Hi a
Hi a a Hi

最佳答案

不要检查eof

eof方法返回输入流读取指针的位置,而不是 get 的状态.这更像是告诉你是否get会成功,所以你可以这样写:

    while (!myfile.eof()) {
char letter;
myfile.get(letter);
//...
}

这样,您至少会在每次迭代中得到一个新字母,并且当读取指针到达输入末尾时循环结束。

但是,还有其他情况可能会导致 get不成功。幸运的是,这些由流本身捕获,由 get 返回.测试流的状态就像将流视为 bool 值一样简单。因此,编写循环的更惯用的方法是:

    char letter;
while (myfile.get(letter)) {
//...
}

查看下一个字母

当您想查看输入中检测到的 'H' 之后的下一个字母时,你执行增量。

            char z = letter++;

但是,这并没有达到预期的效果。相反,它只是同时设置 letterz 'H' 的数值后继变量( 'H' + 1 ),并且不观察输入流中的下一个字母。

您可以使用另一种方法,例如 get ,但将输入留在输入流中。它叫做peek .

            char z;
auto peek = [&]() -> decltype(myfile) {
if (myfile) z = myfile.peek();
return myfile;
};
if (peek()) {
//...
}

现在,您可以检查 z 的值, 但它仍然被认为是下一个 get 的输入在 letter .

接近您实现的内容

因此,完整的循环可能如下所示:

    char letter;
while (myfile.get(letter)) {
if (letter == 'H') {
char z;
auto peek = [&]() -> decltype(myfile) {
if (myfile) z = myfile.peek();
return myfile;
};
if (peek() && z == 'i') {
myfile.get(z);
output << "BYE";
continue;
}
}
output << letter;
}

通过这种方法,您将能够正确处理像 HHi 这样的麻烦情况。作为输入,或者输入中的最后一个字母是 H .

关于c++ - 如何在文件中用 Bye 替换 Hi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58978731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com