在C++中,fstream库(或任何库)中是否有一个函数允许我在不提取的情况下将行读取到'\n'的分隔符?
我知道peek()函数允许程序"偷看"它读取的下一个字符而不提取,但是我需要一个peek()之类的函数来完成这个但是整行.
我试图从正在增长的文件(类似于什么tail -F)中读取,但我的代码必定存在一些问题:
string log, logFile("test.log");
size_t p = 0;
while(true)
{
ifstream ifs(logFile.c_str());
ifs.seekg(p); //*1
while(ifs.eof() == false)
{
getline(ifs, log);
cout << log << endl;
p = ifs.tellg(); //*2
}
nanosleep(&pause, NULL);
}
Run Code Online (Sandbox Code Playgroud)
如果没有//*1和//*2的行,日志文件会被正确读取到最后,但是如果添加新行,则不会发生任何事情.
使用seekg和tellg我试图存储文件的当前结束位置,这样当我重新打开它时,我可以去那里并阅读已添加的内容.
我想知道我的代码有什么问题,如果真的有必要为此目的关闭并重新打开同一个文件.
谢谢.
我知道可以截断一个文件
std::fstream fs(mypath, std::fstream::out | std::fstream::trunc);
Run Code Online (Sandbox Code Playgroud)
但我需要读取文件,截断它,然后用相同的文件句柄写所有内容(所以整个操作是原子的).任何人?
有什么区别:
fstream texfile;
textfile.open("Test.txt");
Run Code Online (Sandbox Code Playgroud)
和
ofstream textfile;
textfile.open("Test.txt");
Run Code Online (Sandbox Code Playgroud)
他们的功能是一样的吗?
在答案中有以下代码:
if (std::ifstream input("input_file.txt"))
;
Run Code Online (Sandbox Code Playgroud)
这似乎很方便,将'input'变量的范围限制在确认有效的位置,但VS2015和g ++似乎都没有编译它.它是某些编译器特定的东西还是需要一些额外的标志?
在VS2015中,IDE突出显示"std :: ifstream"和"input_file.txt"以及最后一个括号."std :: ifstream"标记为"错误:此处不允许使用函数类型".
VS2015 C++编译器给出以下错误:
我知道这是一个noob问题,但是我之前和之后只想访问.txt文件,我曾经使用过Python.所有你需要做的就是确保txt文件在同一个目录中.我在下面有以下C++代码,但它没有找到我在桌面上保存的Numbers.txt文件.我在文件中的所有内容都是一行double类型的数字.我想要做的就是找到文件中所有数字的平均值.程序运行正常,但它不能正确打印输出.通过打印输出[0]检查打印到输出的内容后,我发现该文件没有将其内容复制到数组中.有人可以为我清除这个小问题,或者至少指出我正确的方向指向一个好的教程?
int main() {
cout << "Getting File Information..." << endl;
ifstream file;
char output[100];
//int x;
file.open("Numbers.txt", ios::in); // open file
cout << "Opened File Successfully ****************" << endl;
file >> output; // empty file contents into output
cout << output; // print out contents of file
cout << "Should have printed out results by now" << endl;
//file >> x;
file.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 是否可以在ios :: in和ios :: out不存在的文件上打开fstream而不会出现错误?
利用 std::fstream一个可以声明两种类型的对象ifstream和ofstream.唯一不同的是,随着fstream我们需要提供in,out,app作为一个参数,它可能并不总是需要另外两个.
有什么特别的东西ifstream,ofstream无法实现fstream或只是编码方便吗?
我正在使用C++ fstream来读取配置文件.
#include <fstream>
std::ifstream my_file(my_filename);
Run Code Online (Sandbox Code Playgroud)
现在,如果我传递一个目录的路径,它会默默地忽略它.my_file.good()即使my_filename是目录,Eg 也会返回true .由于这是我的程序的意外输入,我喜欢检查它,并抛出异常.
如何检查刚打开的fstream是否是常规文件,目录或流?
我似乎无法找到一种方法:
在一些论坛讨论中,有人认为这两者都不可能,因为这是依赖于操作系统的,因此永远不会成为fstream C++标准的一部分.
我能想到的唯一选择是重写我的代码以完全摆脱ifstream并使用文件描述符(*fp)的C方法,以及fstat():
#include <stdio.h>
#include <sys/stat.h>
FILE *fp = fopen(my_filename.c_str(), "r");
// skip code to check if fp is not NULL, and if fstat() returns != -1
struct stat fileInfo;
fstat(fileno(fp), &fileInfo);
if (!S_ISREG(fileInfo.st_mode)) {
fclose(fp);
throw std::invalid_argument(std::string("Not a regular file ") + my_filename);
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢fstream.因此,我的问题.