如何在C++中逐个字符地读取文本文件

vsaztqbk  于 2022-12-20  发布在  其他
关注(0)|答案(8)|浏览(143)

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

ou6hu8tu

ou6hu8tu1#

您可以尝试以下操作:

char ch;
fstream fin("file", fstream::in);
while (fin >> noskipws >> ch) {
    cout << ch; // Or whatever
}
nmpmafwu

nmpmafwu2#

@cnicutar和@Pete Becker已经指出了使用noskipws/unsetting skipws一次读取一个字符而不跳过输入中白色字符的可能性。
另一种可能性是使用istreambuf_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)。

goucqfw6

goucqfw63#

引用Bjarne Stroustrup的话:“〉〉操作符用于格式化输入;也就是说,阅读预期类型和格式的对象。2如果不希望这样做,而我们希望将字符作为字符读取,然后检查它们,则使用get()函数。

char c;
while (input.get(c))
{
    // do something with c
}
6g8kf2rb

6g8kf2rb4#

这是一个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();
}
xzlaal3s

xzlaal3s5#

//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.
x6492ojm

x6492ojm6#

回复:textFile.getch(),这是你编的吗?还是你有一个参考文献说它应该能用?如果是后者,就去掉它。如果是前者,就不要这样做。找一个好的参考文献。

char ch;
textFile.unsetf(ios_base::skipws);
textFile >> ch;
nr7wwzry

nr7wwzry7#

假设temp是一个chartextFile是一个std::fstream的导数......
您要查找的语法是

textFile.get( temp );
uklbhaso

uklbhaso8#

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

#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
}

相关问题