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

时间:2013-08-22 22:05:58

标签: c++

所以我现在已经在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标志我只是不知道如何正确实现它

2 个答案:

答案 0 :(得分: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>());

答案 1 :(得分:2)

我认为您尝试做的最好的工具是getgetlineread。现在这些都使用char个缓冲区而不是std::string个,所以需要多考虑一下,但它们真的很简单。 (编辑:std::getline( file, string ),正如DietmarKü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]delete[]而不是静态数组,以避免堆栈溢出。

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