0

因此,作为一种爱好,我已经用 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 标志我只是不知道如何正确实现它

4

2 回答 2

3

当使用格式化输入运算符时,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>());
于 2013-08-22T22:27:43.260 回答
2

我认为你想要做的最好的工具是get,getlineread. 现在这些都使用char缓冲区而不是std::strings,所以需要更多的思考,但它们真的很简单。(编辑:std::getline( file, string )正如 Dietmar Kühl 所指出的,它使用 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]anddelete[]而不是静态数组,以避免堆栈溢出。

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

于 2013-08-22T22:28:39.017 回答