如何从文件中获取字符并显示在控制台上?

How to get characters from a file and display on console?

提问人:malscode 提问时间:5/6/2022 最后编辑:malscode 更新时间:5/6/2022 访问量:451

问:

我从有关文件处理的注释中得到了此代码。根据我对这段代码的理解,我想使用这段代码获取字符,直到到达文件中的 x。为什么我只得到第一个字符?如果此代码不正确,我应该如何更改代码以获取字符,直到达到 x?请帮助我理解这一点<

#include<iostream>
#include<fstream>
#include<string.h>
#include<string>
using namespace std;
int main()
{
    char a = '-';
    do
    {

        ifstream obj("test.txt", ifstream::in);// in would mean import from txt to ram
       // cout << obj << endl;
        if (obj.good() && a != obj.peek())
        {
            a = obj.getline();
            cout << a << endl;
        }
        obj.close();
    } while (a != 'x');
    
    return 0;
}
C++ 文本文件 fstream iostream

评论

1赞 ChrisMM 5/6/2022
a是一个 ,它只能容纳一个字符。此外,在循环的每次迭代中打开和关闭文件,这意味着每次都从头开始读取文件。另外,你的代码甚至不会编译,所以我不知道你从哪里得到这个,或者你是如何尝试使用它的......char
0赞 malscode 5/6/2022
@anastaciu对不起,我的错,它应该是 a= obj.get()。
0赞 Some programmer dude 5/6/2022
考虑打开和关闭文件的时间和位置。
0赞 malscode 5/6/2022
@ChrisMM既然循环会在 a = x 时终止,那么字符 x 之前的整行文本文件不应该显示吗?
0赞 malscode 5/6/2022
@ChrisMM它确实编译了一次。我制作了一个名为 test 的文本文件,并写了“Hello x Hi”。控制台上仅显示 H。

答:

1赞 The Coding Fox 5/6/2022 #1

a是一个字符,并返回一个 .这里不是有什么问题吗?你不能将 an 赋给 ,所以代码甚至无法编译。std::getline()istreamistreamchar

您可以将代码简化为以下工作示例:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;
int main()
{
    ifstream obj("test.txt", ifstream::in);

    if (obj.good())
    {
        std::string line;
        while (std::getline(obj, line))
        {
            for (auto& i : line)
            {
                if (i == 'x') return 0;
                cout << i << endl;
            }
        }
    }
    obj.close();
    return 0;
}

测试 .txt:

This is
a
test fixle

输出:

T
h
i
s

i
s
a
t
e
s
t

f
i

评论

0赞 malscode 5/6/2022
为什么 This 后面有空格,而不是 is、a 和 test 后面?
1赞 The Coding Fox 5/6/2022
因为文件中它们之间没有空格。 在一行中,在另一行中。This istest
2赞 ChrisMM 5/6/2022 #2

obj.getline()无效。我在你的评论中看到你打算写,所以我会坚持使用它。obj.get()

主要问题是您在循环中打开和关闭文件,这意味着,对于每次迭代,您将打开文件,读取一个字符,然后关闭文件。每次打开文件时,您实际上都是从头开始的,因此您不会阅读,直到您到达一个字符,但基本上是无限的。do-while'x'

我没有测试这个,但这似乎是你想要的(评论添加):

#include<iostream>
#include<fstream>
#include<string>

int main()
{
    std::ifstream obj("test.txt"); // open the file (no need to specify "in")
    if ( !obj ) { // check to see if the file could be opened
        std::cout << "Could not open file\n";
    } else {
        char a;
        while ( obj >> a ) { // while there's still something to read
            if ( a != 'x' ) { // if it's not an 'x' character, print it
                std::cout << a << std::endl;
            } else {
                break; // otherwise, break the loop
            }
        }
        obj.close(); // close the file
    }
    
    return 0;
}

评论

0赞 malscode 5/6/2022
if(!obj) 与 if(obj.is_open()) 相同
1赞 ChrisMM 5/6/2022
或多或少,是的。 检查流中是否有任何错误,而不仅仅是检查它是否打开。在这种情况下,它与 though 相同。您可以在此处找到更多信息if ( !obj )obj.is_open()
0赞 malscode 5/6/2022
哦,这是有道理的!非常感谢所有的帮助!