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;
}
这只是输出一个空行,尽管文本文件包含大约一段信息。我已经有一段时间没有使用文件I/O了,所以我有点生疏。感谢您的帮助。
编辑:你们都帮了我很大的忙,还有一件事,我需要在没有句号或空格的情况下通过它们。基本上只是一串字符。
OP的代码不会检查其任何文件IO是否成功,因此文件可能没有打开,文件可能为空,读取可能由于多种原因而失败。
幸运的是,getline
返回输入流,流实现了一个非常简洁的运算符bool,如果流处于错误状态并且无法读取,则返回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由于任何原因失败,包括文件未打开、文件为空、文件已损坏且无法读取,则流的状态将被标记为坏,并在if()
检查时返回false。
通常,在这一点上,您应该检查错误的类型,infile.clear()
流以删除错误条件,并收拾残局,但在这种情况下没有太多意义。如果不能将文件的开头读取为字符串,则会出现大问题,应该仔细查看文件filename[2]
的运行状况和内容。
顺便说一句,如果您的编译器是相对最新的,那么ifstream的构造函数将使用std::字符串,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);
您的函数假设文件名向量中至少有三个元素,并忽略除第三个(元素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;
}
不会报告错误。(你只会有一个空字符串/矢量/数据等)
在循环的其他地方使用它。这里我有一个文件名->文件数据的映射,加载文件名列表中的每个文件名:
for (const string& filename : filenames)
filedata[ filename ] = readfile( filename );
希望这能有所帮助。
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- TCP 服务器/客户端:客户端 recv() 返回空白缓冲区
- QML 函数始终返回空白
- 字符串:: substr()返回一个空白字符串
- 返回空白
- QT 5.4 QPrinterInfo::printerName返回空白
- OpenCV VideoCaptures 有时会返回空白帧
- Qt5.4 QOpenGLFramebufferObject toImage 返回空白图像
- 为什么从文件输入中读取 std::string 会返回空白
- WASAPI GetDisplayName 返回空白
- Getline只返回空白
- 我在我的程序中添加了一个void函数,它不接受任何参数,现在我的程序在运行时只返回一个空白终端
- ReadFile()返回一个空白数据
- QtCreator QMediaPlayer元数据返回空白QString
- 为什么这段代码在试图将.txt放入向量并对其进行cout时会返回空白控制台