所以我现在已经在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标志我只是不知道如何正确实现它
答案 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)
我认为您尝试做的最好的工具是get
,getline
或read
。现在这些都使用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/