将文件读入内存 C++:是否有 std::strings 的 getline()
Reading a file into memory C++: Is there a getline() for std::strings
我被要求更新读取文本文件并解析特定字符串的代码。
基本上我不想每次都打开文本文件,而是想将文本文件读入内存并在对象的持续时间内保存它。
我想知道是否有与 getline() 类似的函数,我可以将它用于 std::string,就像我可以用于 std::ifstream 一样。
我知道我可以只使用 while/for 循环,但我很好奇是否还有其他方法。这是我目前正在做的事情:
file.txt:(\n表示换行)
file.txt
我的代码:
ifstream file("/tmp/file.txt");
int argIndex = 0;
std::string arg,line,substring,whatIneed1,whatIneed2;
if(file)
{
while(std::getline(file,line))
{
if(line.find("3421",0) != string::npos)
{
std::getline(file,line);
std::getline(file,line);
std::stringstream ss1(line);
std::getline(file,line);
std::stringstream ss2(line);
while( ss1 >> arg)
{
if( argIndex==0)
{
whatIneed1 = arg;
}
argIndex++;
}
argIndex=0;
while( ss2 >> arg)
{
if( argIndex==0)
{
whatIneed2 = arg;
}
argIndex++;
}
argIndex=0;
}
}
}
最后 whatIneed1=="whatIneed1" 和 whatIneed2=="whatIneed2".
有没有一种方法可以将 file.txt 存储在 std::string 而不是 std::ifstream 中,并使用像 getline() 这样的函数来实现?我喜欢 getline() 因为它使获取文件的下一行变得容易得多。
如果您已经将数据读入字符串,您可以使用std::stringstream
将其转换为与getline
兼容的类文件对象。
std::stringstream ss;
ss.str(file_contents_str);
std::string line;
while (std::getline(ss, line))
// ...
与其抓住一条线然后尝试从中提取一件事,为什么不提取一件事,然后丢弃这条线呢?
std::string whatIneed1, whatIneed2, ignored;
if(ifstream file("/tmp/file.txt"))
{
for(std::string line; std::getline(file,line);)
{
if(line.find("3421",0) != string::npos)
{
std::getline(file, ignored);
file >> whatIneed1;
std::getline(file, ignored);
file >> whatIneed2;
std::getline(file, ignored);
}
}
}
我被要求更新读取文本文件并解析特定字符串的代码。
基本上我不想每次都打开文本文件,而是想将文本文件读入内存并在对象的持续时间内保存它。
我想知道是否有与 getline() 类似的函数,我可以将它用于 std::string,就像我可以用于 std::ifstream 一样。
我知道我可以只使用 while/for 循环,但我很好奇是否还有其他方法。这是我目前正在做的事情:
file.txt:(\n表示换行)
file.txt
我的代码:
ifstream file("/tmp/file.txt");
int argIndex = 0;
std::string arg,line,substring,whatIneed1,whatIneed2;
if(file)
{
while(std::getline(file,line))
{
if(line.find("3421",0) != string::npos)
{
std::getline(file,line);
std::getline(file,line);
std::stringstream ss1(line);
std::getline(file,line);
std::stringstream ss2(line);
while( ss1 >> arg)
{
if( argIndex==0)
{
whatIneed1 = arg;
}
argIndex++;
}
argIndex=0;
while( ss2 >> arg)
{
if( argIndex==0)
{
whatIneed2 = arg;
}
argIndex++;
}
argIndex=0;
}
}
}
最后 whatIneed1=="whatIneed1" 和 whatIneed2=="whatIneed2".
有没有一种方法可以将 file.txt 存储在 std::string 而不是 std::ifstream 中,并使用像 getline() 这样的函数来实现?我喜欢 getline() 因为它使获取文件的下一行变得容易得多。
如果您已经将数据读入字符串,您可以使用std::stringstream
将其转换为与getline
兼容的类文件对象。
std::stringstream ss;
ss.str(file_contents_str);
std::string line;
while (std::getline(ss, line))
// ...
与其抓住一条线然后尝试从中提取一件事,为什么不提取一件事,然后丢弃这条线呢?
std::string whatIneed1, whatIneed2, ignored;
if(ifstream file("/tmp/file.txt"))
{
for(std::string line; std::getline(file,line);)
{
if(line.find("3421",0) != string::npos)
{
std::getline(file, ignored);
file >> whatIneed1;
std::getline(file, ignored);
file >> whatIneed2;
std::getline(file, ignored);
}
}
}