将包含空格的文件中的文本存储为字符串

storing text to string from a file that contains spaces

本文关键字:存储 字符串 文本 文件 包含 空格      更新时间:2023-10-16

所以作为一种爱好,我已经在C++中做了大约3个月的算法。到目前为止,我从未遇到过无法通过谷歌搜索解决的问题。我试图从一个将被转换为哈希表的文本文件中读取数据,但当我试图从文件中捕获数据时,它会以空格结束。这是代码

#include <iostream>
#include <fstream>
int main()
{
    using namespace std;
    ifstream file("this.hash");
    file >> noskipws;
    string thing;
    file >> thing;
    cout << thing << endl;
    return 0;
}

我知道noskipws标志,只是不知道如何正确实现它

当为std::string使用格式化的输入运算符时,它总是停在流认为是空白的地方。使用std::locale的字符分类方面std::ctype<char>,您可以重新定义空间的含义。不过,这有点复杂。

如果您想读取特定的分隔符,可以使用std::getline(),可能会指定您感兴趣的分隔符。例如:

std::string value;
if (std::getline(in, value, ',')) { ... }

读取字符,直到找到逗号或到达文件末尾,并将字符存储到value中的分隔符。

如果你只想读取整个文件,一种方法是使用

std::ifstream in(file.c_str());
std::string   all((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());

我认为您尝试执行的操作的最佳工具是getgetlineread。现在,这些都使用char缓冲区,而不是std::string缓冲区,所以需要更多的考虑,但它们实际上非常简单。(编辑:正如Dietmar Kühl所指出的,std::getline( file, string )使用c++字符串而不是字符缓冲区,所以我实际上建议这样做。这样你就不必担心最大行长度了)

下面是一个将在整个文件中循环的示例:

#include <iostream>
int main () {
    char buffer[1024]; // line length is limited to 1023 bytes
    std::ifstream file( "this.hash" );
    while( file.good( ) ) {
        file.getline( buffer, sizeof( buffer ) );
        std::string line( buffer ); // convert to c++ string for convenience
        // do something with the line
    }
    return 0;
}

(请注意,行长度限制为1023字节,如果一行更长,它将被分成2个读数。当它是真正的换行符时,你会在字符串的末尾看到一个n字符)

当然,如果你提前为文件设定了最大长度,你可以相应地设置缓冲区,然后取消循环。如果缓冲区需要很大(超过几千字节),则可能应该使用new char[size]delete[]而不是静态数组,以避免堆栈溢出。

这是一个参考页面:http://www.cplusplus.com/reference/fstream/ifstream/