如何使用C ++打开文件?
我想以C ++方式打开文件进行读取。我需要能够做到以下几点:
- 文本文件,这将涉及某种读取行功能。
- 二进制文件,这将提供一种将原始数据读入" char *"缓冲区的方法。
解决方案
回答
有三种方法可以执行此操作,具体取决于需求。我们可以使用老式的C方法并调用fopen / fread / fclose,也可以使用C ++ fstream工具(ifstream / ofstream),或者如果我们使用的是MFC,请使用CFile类,该类提供了完成实际操作的功能。文件操作。
所有这些都适用于文本和二进制,尽管它们都没有特定的readline功能。在这种情况下,我们最有可能做的是使用fstream类(fstream.h)并使用流运算符(<<和>>)或者read函数读取/写入文本块:
int nsize = 10; char *somedata; ifstream myfile; myfile.open("<path to file>"); myfile.read(somedata,nsize); myfile.close();
请注意,如果我们使用的是Visual Studio 2005或者更高版本,则可能无法使用传统的fstream(有一个新的Microsoft实现,该实现略有不同,但完成的功能相同)。
回答
如果我们只想阅读,则需要使用" ifstream"(使用" ofstream"来编写,或者都使用" fstream")。
要以文本模式打开文件,请执行以下操作:
ifstream in("filename.ext", ios_base::in); // the in flag is optional
要以二进制模式打开文件,只需添加" binary"标志。
ifstream in2("filename2.ext", ios_base::in | ios_base::binary );
使用ifstream.read()
函数读取一个字符块(以二进制或者文本模式)。使用getline()函数(全局)来读取整行。
回答
fstream很棒,但我会更深入地介绍RAII。
一个经典示例的问题在于,我们不得不自己关闭文件,这意味着我们必须将架构调整为这种需要。 RAII利用C ++中的自动析构函数调用为我们关闭文件。
更新:似乎std :: fstream已经实现了RAII,所以下面的代码是无用的。我将其保留在这里以供后代之用,并作为RAII的一个例子。
class FileOpener { public: FileOpener(std::fstream& file, const char* fileName): m_file(file) { m_file.open(fileName); } ~FileOpeneer() { file.close(); } private: std::fstream& m_file; };
我们现在可以在代码中使用此类,如下所示:
int nsize = 10; char *somedata; ifstream myfile; FileOpener opener(myfile, "<path to file>"); myfile.read(somedata,nsize); // myfile is closed automatically when opener destructor is called
学习RAII的工作方式可以为我们节省一些头痛和一些主要的内存管理错误。