Getline 只返回空白
Getline is returning nothing but blank
我试图连续打开多个文件。文件名都存储在一个向量中,传递给我的函数。这只是一个简单的测试,以确保一切正常。如果它有效,那么我将需要将文件包含的任何内容推回到另一个向量中。
void readfile(vector<string> &filename)
{
string temp;
ifstream infile(filename[2].c_str());
getline (infile, temp);
cout << temp << endl;
}
虽然文本文件中包含一段信息,但这只是输出一个空行。好久没用FileI/O了,有点生疏了。任何帮助表示赞赏。
编辑:你们都帮了大忙,还有一件事,我需要在没有句点或空格的情况下传递它们。基本上只是一串字符。
您的函数假定您的文件名向量中至少有三个元素,并忽略除第三个(元素 2)之外的所有文件名。
此外,对 getline() 的调用仅读取文件的 第一行 -- 这可能是一个空行。
我建议您编写一个函数来提取 单个 文件的内容,并在循环中(在另一个函数中?)使用它来处理列表中的每个文件名文件名。
相关地,'filename' 表示单个文件名; 'filenames' 最好表明您的变量是 多个 个文件名。
// Return file content as a single string
string readfile( const string& filename )
{
ifstream f( filename );
stringstream ss;
ss << f.rdbuf();
return ss.str();
}
// Return file content as a vector/deque/whatever of strings
deque<string> readfile( const string& filename )
{
ifstream f( filename );
deque<string> lines;
string line;
while (getline( f, line )) lines.emplace_back( line );
return lines;
}
不报错。 (您将只有一个空 string/vector/deque/etc。)
在循环的其他地方使用它。这里我有一个文件名->文件数据的映射,加载文件名列表中的每个文件名:
for (const string& filename : filenames)
filedata[ filename ] = readfile( filename );
希望对您有所帮助。
OP 的代码不会检查其任何文件 IO 是否成功,因此文件可能尚未打开,文件可能为空,并且读取可能由于多种原因而失败。
幸运的是,getline
returns 输入流和流实现了一个非常简洁的运算符 bool,如果流处于错误状态且无法读取,则 returns false .如果无法读取文件,则 temp 的内容肯定无效,不应使用。
所以...
void readfile(vector<string> &filename)
{
string temp;
ifstream infile(filename[2].c_str());
if (getline (infile, temp)) //test the read for success
{
cout << temp << endl;
}
else
{
cout << "failed to read file" << endl;
}
}
如果 getline 由于任何原因失败,包括文件未打开、文件为空、文件已损坏且不可读,流的状态将被标记为错误,并且 return 在 if()
检查时为 false .
通常此时您应该检查错误的类型,infile.clear()
删除错误条件的流,并收拾碎片,但在这种情况下没有太大意义。如果您无法将文件的开头读入字符串,那您就有大问题了,应该仔细查看文件 filename[2]
.
的健康状况和内容
顺便说一下,如果你的编译器相对来说是最新的,ifstream 的构造函数会吃掉一个 std::string 而 ifstream infile(filename[2]);
将是有效的。
就风格而言,最好将文件名字符串传递给 readfile,而不是向量。这允许您重用 readfile
函数,而不仅仅是向量的元素 2。
void readfile(string & filename)
{
string temp;
ifstream infile(filename);
if (getline (infile, temp)) //test the read for success
{
cout << temp << endl;
}
else
{
cout << "failed to read file " << filename << endl;
}
}
然后用
打电话
readfile(filename[2]);
扩展此功能以满足 OP 的真正目标
void readfile(string & filename,
vector<string> & strings)
{
string temp;
ifstream infile(filename);
if (getline (infile, temp)) //test the read for success
{
strings.push_back(temp);
cout << temp << endl;
}
else
{
cout << "failed to read file " << filename << endl;
}
}
并用
打电话
vector<string> strings;
...
readfile(filename[2], strings);
我试图连续打开多个文件。文件名都存储在一个向量中,传递给我的函数。这只是一个简单的测试,以确保一切正常。如果它有效,那么我将需要将文件包含的任何内容推回到另一个向量中。
void readfile(vector<string> &filename)
{
string temp;
ifstream infile(filename[2].c_str());
getline (infile, temp);
cout << temp << endl;
}
虽然文本文件中包含一段信息,但这只是输出一个空行。好久没用FileI/O了,有点生疏了。任何帮助表示赞赏。
编辑:你们都帮了大忙,还有一件事,我需要在没有句点或空格的情况下传递它们。基本上只是一串字符。
您的函数假定您的文件名向量中至少有三个元素,并忽略除第三个(元素 2)之外的所有文件名。
此外,对 getline() 的调用仅读取文件的 第一行 -- 这可能是一个空行。
我建议您编写一个函数来提取 单个 文件的内容,并在循环中(在另一个函数中?)使用它来处理列表中的每个文件名文件名。
相关地,'filename' 表示单个文件名; 'filenames' 最好表明您的变量是 多个 个文件名。
// Return file content as a single string
string readfile( const string& filename )
{
ifstream f( filename );
stringstream ss;
ss << f.rdbuf();
return ss.str();
}
// Return file content as a vector/deque/whatever of strings
deque<string> readfile( const string& filename )
{
ifstream f( filename );
deque<string> lines;
string line;
while (getline( f, line )) lines.emplace_back( line );
return lines;
}
不报错。 (您将只有一个空 string/vector/deque/etc。)
在循环的其他地方使用它。这里我有一个文件名->文件数据的映射,加载文件名列表中的每个文件名:
for (const string& filename : filenames)
filedata[ filename ] = readfile( filename );
希望对您有所帮助。
OP 的代码不会检查其任何文件 IO 是否成功,因此文件可能尚未打开,文件可能为空,并且读取可能由于多种原因而失败。
幸运的是,getline
returns 输入流和流实现了一个非常简洁的运算符 bool,如果流处于错误状态且无法读取,则 returns false .如果无法读取文件,则 temp 的内容肯定无效,不应使用。
所以...
void readfile(vector<string> &filename)
{
string temp;
ifstream infile(filename[2].c_str());
if (getline (infile, temp)) //test the read for success
{
cout << temp << endl;
}
else
{
cout << "failed to read file" << endl;
}
}
如果 getline 由于任何原因失败,包括文件未打开、文件为空、文件已损坏且不可读,流的状态将被标记为错误,并且 return 在 if()
检查时为 false .
通常此时您应该检查错误的类型,infile.clear()
删除错误条件的流,并收拾碎片,但在这种情况下没有太大意义。如果您无法将文件的开头读入字符串,那您就有大问题了,应该仔细查看文件 filename[2]
.
顺便说一下,如果你的编译器相对来说是最新的,ifstream 的构造函数会吃掉一个 std::string 而 ifstream infile(filename[2]);
将是有效的。
就风格而言,最好将文件名字符串传递给 readfile,而不是向量。这允许您重用 readfile
函数,而不仅仅是向量的元素 2。
void readfile(string & filename)
{
string temp;
ifstream infile(filename);
if (getline (infile, temp)) //test the read for success
{
cout << temp << endl;
}
else
{
cout << "failed to read file " << filename << endl;
}
}
然后用
打电话readfile(filename[2]);
扩展此功能以满足 OP 的真正目标
void readfile(string & filename,
vector<string> & strings)
{
string temp;
ifstream infile(filename);
if (getline (infile, temp)) //test the read for success
{
strings.push_back(temp);
cout << temp << endl;
}
else
{
cout << "failed to read file " << filename << endl;
}
}
并用
打电话vector<string> strings;
...
readfile(filename[2], strings);