2008-08-11 5 views
19

Я хочу открыть файл для чтения, путь C++. Я должен уметь это делать:Как открыть файл на C++?

  • текстовые файлы, которые будут включать некоторую функцию чтения строки.

  • двоичные файлы, которые предоставят возможность считывать необработанные данные в буфер char*.

+1

[C++: ввод/вывод с файлами] (http://www.cplusplus.com/doc/tutorial/files.html) – mreggen 2008-08-11 15:53:34

+0

Любой, кто интересуется RAII, должен проверить [Официальное управление ресурсами Страница] (http://www.relisoft.com/resource/resmain.html) от Bartosz Milewski. – titanae 2008-09-08 12:43:12

ответ

8

Существует три способа сделать это, в зависимости от ваших потребностей. Вы можете использовать способ старой школы C и вызвать fopen/fread/fclose, или вы можете использовать средства Cstream fstream (ifstream/ofstream), или если вы используете MFC, используйте класс CFile, который предоставляет функции для выполнения фактических файловые операции.

Все они подходят как для текстовых, так и для двоичных, хотя ни одна из них не имеет конкретных функций чтения. То, что вы бы, скорее всего, делать вместо этого в этом случае использовать классы fstream (fstream.h) и использовать операторы потока (< < и >>) или функцию чтения для чтения блоков/записи текста:

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

Обратите внимание, что если вы используете Visual Studio 2005 или выше, традиционный fstream может быть недоступен (есть новая реализация Microsoft, которая немного отличается, но выполняет одно и то же).

+6

Не могли бы вы получить segfault на чтение? Вы не выделили места для данных. Должен быть «char somedata [10]», правильно? – swdev 2013-09-16 08:30:38

24

Вам необходимо использовать ifstream, если вы просто хотите прочитать (используйте ofstream для записи, или fstream для обоих).

Чтобы открыть файл в текстовом режиме, выполните следующие действия:

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

+1, отметив, что вместо функции-члена следует использовать глобальную функцию getline(). – foraidt 2009-08-14 16:57:02

-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 работы может спасти вас от головной боли и некоторые основные ошибки управления памятью.

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

Чтобы открыть и прочитать двоичный файл, вам необходимо явно объявить формат для чтения в вашем входном потоке бинарным, и читать память, которая не имеет четкого толкования с помощью функции-члена потока 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>

Смежные вопросы