简体   繁体   English

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

[英]How do you open a file in C++?

I want to open a file for reading, the C++ way. 我想打开一个文件进行阅读,即C ++方式。 I need to be able to do it for: 我需要能够做到:

  • text files, which would involve some sort of read line function. 文本文件,涉及某种读取线功能。

  • binary files, which would provide a way to read raw data into a char* buffer. 二进制文件,它提供了一种将原始数据读入char*缓冲区的方法。

You need to use an ifstream if you just want to read (use an ofstream to write, or an fstream for both). 如果你只想阅读(使用ofstream写入,或使用fstream两者),你需要使用ifstream

To open a file in text mode, do the following: 要以文本模式打开文件,请执行以下操作:

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

To open a file in binary mode, you just need to add the "binary" flag. 要以二进制模式打开文件,只需添加“binary”标志即可。

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

Use the ifstream.read() function to read a block of characters (in binary or text mode). 使用ifstream.read()函数读取一个字符块(以二进制或文本模式)。 Use the getline() function (it's global) to read an entire line. 使用getline()函数(它是全局的)来读取整行。

There are three ways to do this, depending on your needs. 根据您的需要,有三种方法可以做到这一点。 You could use the old-school C way and call fopen/fread/fclose, or you could use the C++ fstream facilities (ifstream/ofstream), or if you're using MFC, use the CFile class, which provides functions to accomplish actual file operations. 您可以使用旧式C语言并调用fopen / fread / fclose,或者您可以使用C ++ fstream工具(ifstream / ofstream),或者如果您使用的是MFC,请使用CFile类,它提供了实现实际的功能文件操作。

All of these are suitable for both text and binary, though none have a specific readline functionality. 所有这些都适用于文本和二进制,但没有一个具有特定的readline功能。 What you'd most likely do instead in that case is use the fstream classes (fstream.h) and use the stream operators (<< and >>) or the read function to read/write blocks of text: 在这种情况下,你最有可能做的是使用fstream类(fstream.h)并使用流操作符(<<和>>)或读取函数来读/写文本块:

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

Note that, if you're using Visual Studio 2005 or higher, traditional fstream may not be available (there's a new Microsoft implementation, which is slightly different, but accomplishes the same thing). 请注意,如果您使用的是Visual Studio 2005或更高版本,则可能无法使用传统的fstream(有一个新的Microsoft实现,略有不同,但完成相同的操作)。

To open and read a text file line per line, you could use the following: 要每行打开和读取文本文件行,可以使用以下命令:

// 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);
}

To open and read a binary file you need to explicitly declare the reading format in your input stream to be binary, and read memory that has no explicit interpretation using stream member function read() : 要打开和读取二进制文件,您需要在输入流中显式声明读取格式为二进制,并使用流成员函数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);

When doing this you'll need to #include the header : <iostream> 执行此操作时,您需要#include标头: <iostream>

#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;
}
#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......
}

Follow the steps, 按照步骤,

  1. Include Header files or name space to access File class. 包括头文件或名称空间以访问File类。
  2. Make File class object Depending on your IDE platform ( ie, CFile,QFile,fstream). Make File类对象取决于您的IDE平台(即CFile,QFile,fstream)。
  3. Now you can easily find that class methods to open/read/close/getline or else of any file. 现在您可以轻松找到打开/读取/关闭/获取或其他任何文件的类方法。
 CFile/QFile/ifstream m_file; m_file.Open(path,Other parameter/mood to open file); 

For reading file you have to make buffer or string to save data and you can pass that variable in read() method. 对于读取文件,您必须使用缓冲区或字符串来保存数据,并且可以在read()方法中传递该变量。

**#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;
}
}**
#include <fstream>

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

fstream are great but I will go a little deeper and tell you about RAII . fstream很棒,但我会更深入地告诉你有关RAII的信息

The problem with a classic example is that you are forced to close the file by yourself, meaning that you will have to bend your architecture to this need. 一个典型示例的问题是您被迫自己关闭文件,这意味着您必须根据此需求弯曲架构。 RAII makes use of the automatic destructor call in C++ to close the file for you. RAII利用C ++中的自动析构函数调用来为您关闭文件。

Update : seems that std::fstream already implements RAII so the code below is useless. 更新 :似乎std :: fstream已经实现了RAII,因此下面的代码是无用的。 I'll keep it here for posterity and as an example of 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;
};

You can now use this class in your code like this: 您现在可以在代码中使用此类,如下所示:

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

Learning how RAII works can save you some headaches and some major memory management bugs. 了解RAII如何工作可以为您节省一些麻烦和一些主要的内存管理错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM