Я хочу открыть файл для чтения, путь С++. Мне нужно сделать это для:
-
текстовые файлы, которые будут включать некоторую функцию чтения строки.
-
двоичные файлы, которые предоставили бы способ чтения необработанных данных в буфер
char*
.
Я хочу открыть файл для чтения, путь С++. Мне нужно сделать это для:
текстовые файлы, которые будут включать некоторую функцию чтения строки.
двоичные файлы, которые предоставили бы способ чтения необработанных данных в буфер char*
.
Есть три способа сделать это, в зависимости от ваших потребностей. Вы можете использовать способ старой школы C и вызвать fopen/fread/fclose, или вы можете использовать средства Cstream fstream (ifstream/ofstream), или если вы используете MFC, используйте класс CFile, который предоставляет функции для выполнения фактических файловых операций.
Все они подходят как для текстовых, так и для двоичных файлов, хотя ни одна из них не имеет конкретных функций readline. В этом случае вы скорее всего будете использовать классы 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, которая немного отличается, но выполняет одно и то же).
Вам нужно использовать 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()
(она глобальная) для чтения целой строки.
Чтобы открыть и прочитать строку текстового файла в строке, вы можете использовать следующее:
// 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>
#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......
}
fstream великолепны, но я пойду немного глубже и расскажу вам о RAII.
Проблема с классическим примером заключается в том, что вы вынуждены закрыть файл самостоятельно, а это значит, что вам придется сгибать свою архитектуру для этой потребности. RAII использует вызов автоматического деструктора в С++, чтобы закрыть файл для вас.
Обновление: похоже, что 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, может сэкономить вам некоторые головные боли и некоторые основные ошибки управления памятью.