如何在 C++ 中打开文件?

How do you open a file in C++?

提问人:andrewrk 提问时间:8/11/2008 最后编辑:Zieziandrewrk 更新时间:7/10/2021 访问量:203491

问:

我想打开一个文件进行阅读,C++方式。我需要能够做到这一点:

  • 文本文件,这将涉及某种读取行函数。

  • 二进制文件,这将提供一种将原始数据读入缓冲区的方法。char*

C++ 文件 IO

评论

2赞 mreggen 8/11/2008
C++:文件输入/输出
0赞 titanae 9/8/2008
任何对 RAII 感兴趣的人都应该查看 Bartosz Milewski 的官方资源管理页面

答:

16赞 DannySmurf 8/11/2008 #1

有三种方法可以做到这一点,具体取决于您的需要。您可以使用老式的 C 方式并调用 //,也可以使用 C++ fstream 工具 (/),或者如果您使用的是 MFC,请使用该类,该类提供函数来完成实际的文件操作。fopenfreadfcloseifstreamofstreamCFile

所有这些都适用于文本和二进制文件,尽管没有一个具有特定的读数行功能。在这种情况下,您最有可能做的是使用 fstream 类 (fstream.h) 并使用流运算符(<< 和 >>)或 read 函数来读/写文本块:

int nsize = 10;
std::vector<char> somedata(nsize);
ifstream myfile;
myfile.open("<path to file>");
myfile.read(somedata.data(), nsize);
myfile.close();

请注意,如果您使用的是 Visual Studio 2005 或更高版本,则传统的 fstream 可能不可用(有一个新的 Microsoft 实现,它略有不同,但完成相同的操作)。

评论

13赞 swdev 9/16/2013
你不会在读取时出现段错误吗?您没有为数据分配任何空间。应该是,对吧?char somedata[10]
44赞 Derek Park 8/11/2008 #2

如果您只想读取,则需要使用 ifstream(使用 an 写入,或两者都使用 an)。ofstreamfstream

要在文本模式下打开文件,请执行以下操作:

ifstream in("filename.ext", ios_base::in); // the in flag is optional

要以二进制模式打开文件,您只需要添加“二进制”标志。

ifstream in2("filename2.ext", ios_base::in | ios_base::binary ); 

使用 ifstream.read() 函数读取字符块(以二进制或文本模式)。使用 getline() 函数(它是全局的)读取整行。

评论

0赞 foraidt 8/15/2009
+1 表示将使用全局 getline() 函数而不是成员函数。
0赞 rogerdpack 5/1/2010
我假设二进制标志仅在 Windows 环境中需要?
0赞 Derek Park 7/10/2010
罗杰,我从来没有发现过我在 Windows 或 Unix 上需要二进制标志的情况。不过,从理论上讲,它应该用于避免任何隐式转换。stdcxx.apache.org/doc/stdlibug/30-4.html
-3赞 Vincent Robert 8/12/2008 #3

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 的工作原理可以为您省去一些麻烦和一些主要的内存管理错误。

评论

6赞 Flame 9/20/2008
文件流对象在其析构函数中被关闭,因此这个新类是无用的。
1赞 J.p. 7/18/2014 #4
#include <iostream>
#include <fstream>
using namespace std;

void main()
{
    ifstream in_stream; // fstream command to initiate "in_stream" as a command.
    char filename[31]; // variable for "filename".
    cout << "Enter file name to open :: "; // asks user for input for "filename".
    cin.getline(filename, 30); // this gets the line from input for "filename".
    in_stream.open(filename); // this in_stream (fstream) the "filename" to open.
    if (in_stream.fail())
    {
        cout << "Could not open file to read.""\n"; // if the open file fails.
        return;
    }
    //.....the rest of the text goes beneath......
}
3赞 Ziezi 12/14/2015 #5

若要打开并逐行读取文本文件,可以使用以下命令:

// define your file name
string file_name = "data.txt";

// attach an input stream to the wanted file
ifstream input_stream(file_name);

// check stream status
if (!input_stream) cerr << "Can't open input file!";

// file contents  
vector<string> text;

// one line
string line;

// extract all the text from the input file
while (getline(input_stream, line)) {

    // store each line in the vector
    text.push_back(line);
}

要打开和读取二进制文件,您需要在输入流中显式声明读取格式为二进制格式,并使用流成员函数 read() 读取没有显式解释的内存:

// define your file name
string file_name = "binary_data.bin";

// attach an input stream to the wanted file
ifstream input_stream(file_name, ios::binary);

// check stream status
if (!input_stream) cerr << "Can't open input file!";

// use function that explicitly specifies the amount of block memory read 
int memory_size = 10;

// allocate 10 bytes of memory on heap
char* dynamic_buffer = new char[memory_size];

// read 10 bytes and store in dynamic_buffer
file_name.read(dynamic_buffer, memory_size);

执行此操作时,您需要标题:#include<iostream>

2赞 Nardine Nabil 3/30/2018 #6
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream file;
  file.open ("codebind.txt");
  file << "Please writr this text to a file.\n this text is written using C++\n";
  file.close();
  return 0;
}

评论

4赞 mech 3/30/2018
您能否简要说明此代码片段如何/为什么回答了这个问题?
-1赞 Maria Emil 3/30/2018 #7
#include <fstream>

ifstream infile;
infile.open(**file path**);
while(!infile.eof())
{
   getline(infile,data);
}
infile.close();

评论

1赞 Michael 3/30/2018
你应该在代码之前或用注释来解释你的答案,以便其他人可以了解你要做什么。
0赞 Kartik Maheshwari 4/26/2018 #8

按照以下步骤操作,

  1. 包括头文件或命名空间以访问 File 类。
  2. 使 File 类对象取决于您的 IDE 平台(即 CFile,QFile,fstream)。
  3. 现在,您可以轻松找到该类方法来打开/读取/关闭/获取行或其他任何文件。
CFile/QFile/ifstream m_file;
m_file.Open(path,Other parameter/mood to open file);

为了读取文件,你必须制作缓冲区或字符串来保存数据,你可以在read()方法中传递该变量。

0赞 Karim Salah 4/13/2019 #9
**#include<fstream> //to use file
#include<string>  //to use getline
using namespace std;
int main(){
ifstream file;
string str;
file.open("path the file" , ios::binary | ios::in);
while(true){
   getline(file , str);
   if(file.fail())
       break;
   cout<<str;
}
}**