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

时间:2008-08-11 15:50:52

标签: c++ file io

我想打开一个用于阅读的文件,即C ++方式。我需要能够做到:

  • 文本文件,涉及某种读取线功能。

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

9 个答案:

答案 0 :(得分:29)

如果您只是想阅读(使用ofstream进行写入,或使用fstream,则需要使用ifstream

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

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()函数(它是全局的)来读取整行。

答案 1 :(得分:8)

根据您的需要,有三种方法可以做到这一点。您可以使用旧式C语言并调用fopen / fread / fclose,或者您可以使用C ++ fstream工具(ifstream / ofstream),或者如果您使用的是MFC,请使用CFile类,它提供了实现实际的功能文件操作。

所有这些都适用于文本和二进制,但没有一个具有特定的readline功能。在这种情况下,你最有可能做的是使用fstream类(fstream.h)并使用流操作符(<<>>)或读取函数来读/写文本块: / p>

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

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

答案 2 :(得分:2)

要打开并读取每行的文本文件行,您可以使用以下命令:

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

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

// 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>

答案 3 :(得分:1)

#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 :(得分: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......
}

答案 5 :(得分:0)

按照步骤

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

#include <fstream>

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

答案 8 :(得分:-2)

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