如何使用C ++打开文件?

时间:2020-03-05 18:38:58  来源:igfitidea点击:

我想以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的工作方式可以为我们节省一些头痛和一些主要的内存管理错误。