23

我想知道是否有人可以帮助我弄清楚如何逐个字符地读取 C++ 中的文本文件。这样,我可以有一个 while 循环(虽然还剩下文本),我将文本文档中的下一个字符存储在一个临时变量中,这样我就可以用它做一些事情,然后用下一个字符重复这个过程。我知道如何打开文件和所有内容,但temp = textFile.getchar()似乎不起作用。提前致谢。

4

8 回答 8

49

您可以尝试以下方法:

char ch;
fstream fin("file", fstream::in);
while (fin >> noskipws >> ch) {
    cout << ch; // Or whatever
}
于 2012-09-02T21:54:33.303 回答
13

@cnicutar 和@Pete Becker 已经指出了使用noskipws/unsettingskipws一次读取一个字符而不跳过输入中的空白字符的可能性。

另一种可能性是使用 anistreambuf_iterator来读取数据。除此之外,我通常会使用标准算法std::transform来进行读取和处理。

举个例子,假设我们想做一个类似凯撒的密码,从标准输入复制到标准输出,但是每个大写字符加 3,所以A会变成DB可能变成E,等等(最后,它会环绕所以XYZ转换为ABC.

如果我们要在 C 中这样做,我们通常会使用这样的循环:

int ch;
while (EOF != (ch = getchar())) {
    if (isupper(ch)) 
        ch = ((ch - 'A') +3) % 26 + 'A';
    putchar(ch);
}

要在 C++ 中做同样的事情,我可能会编写更像这样的代码:

std::transform(std::istreambuf_iterator<char>(std::cin),
               std::istreambuf_iterator<char>(),
               std::ostreambuf_iterator<char>(std::cout),
               [](int ch) { return isupper(ch) ? ((ch - 'A') + 3) % 26 + 'A' : ch;});

以这种方式完成这项工作,您会收到连续字符作为传递给(在这种情况下)lambda 函数的参数值(尽管如果您愿意,可以使用显式仿函数而不是 lambda)。

于 2012-09-02T22:42:53.487 回答
9

引用 Bjarne Stroustrup 的话:“>> 运算符用于格式化输入;也就是说,读取预期类型和格式的对象。如果不希望这样做并且我们希望将字符读取为字符然后检查它们,我们使用 get () 功能。”

char c;
while (input.get(c))
{
    // do something with c
}
于 2012-09-02T22:06:12.883 回答
5
    //Variables
    char END_OF_FILE = '#';
    char singleCharacter;

    //Get a character from the input file
    inFile.get(singleCharacter);

    //Read the file until it reaches #
    //When read pointer reads the # it will exit loop
    //This requires that you have a # sign as last character in your text file

    while (singleCharacter != END_OF_FILE)
    {
         cout << singleCharacter;
         inFile.get(singleCharacter);
    }

   //If you need to store each character, declare a variable and store it
   //in the while loop.
于 2012-12-08T06:23:23.847 回答
5

这是一个 c++ 时尚的函数,您可以使用它来逐个字符地读取文件。

void readCharFile(string &filePath) {
    ifstream in(filePath);
    char c;

    if(in.is_open()) {
        while(in.good()) {
            in.get(c);
            // Play with the data
        }
    }

    if(!in.eof() && in.fail())
        cout << "error reading " << filePath << endl;

    in.close();
}
于 2016-12-02T10:40:39.583 回答
2

回复:textFile.getch(),你是自己编的,还是有参考资料说它应该有效?如果是后者,请摆脱它。如果是前者,请不要这样做。得到一个很好的参考。

char ch;
textFile.unsetf(ios_base::skipws);
textFile >> ch;
于 2012-09-02T21:54:00.347 回答
1

假设它temp是一个char 并且textFile是一个std::fstream导数......

您正在寻找的语法是

textFile.get( temp );
于 2012-09-02T21:55:15.747 回答
1

没有理由不在<stdio.h>C++ 中使用 C,事实上它通常是最佳选择。

#include <stdio.h>

int
main()  // (void) not necessary in C++
{
    int c;
    while ((c = getchar()) != EOF) {
        // do something with 'c' here
    }
    return 0; // technically not necessary in C++ but still good style
}
于 2012-09-02T21:56:32.260 回答