Я хочу открыть файл для чтения, C ++. Я должен быть в состоянии сделать это для:
текстовые файлы, которые будут включать какую-то функцию чтения строки.
двоичные файлы, которые обеспечивают способ чтения необработанных данных в
char*
буфер.
Есть три способа сделать это, в зависимости от ваших потребностей. Вы можете использовать старый способ C и вызывать fopen / fread / fclose, или вы можете использовать средства C ++ fstream (ifstream / ofstream), или, если вы используете MFC, использовать класс CFile, который предоставляет функции для выполнения реальных задач. файловые операции.
Все они подходят как для текстового, так и для двоичного кода, хотя ни один из них не имеет определенной функциональности readline. Вместо этого в этом случае вы, скорее всего, будете использовать классы fstream (fstream.h) и использовать операторы потока (<< и >>) или функцию read для чтения / записи блоков текста:
int nsize = 10;
char *somedata;
ifstream myfile;
myfile.open("<path to file>");
myfile.read(somedata,nsize);
myfile.close();
Обратите внимание, что если вы используете Visual Studio 2005 или выше, традиционный fstream может быть недоступен (есть новая реализация Microsoft, которая немного отличается, но выполняет то же самое).
char somedata[10]
, верно? Вам нужно использовать, 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()
функцию (она глобальная), чтобы прочитать всю строку.
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, может избавить вас от головной боли и некоторых серьезных ошибок управления памятью.
#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......
}
Чтобы открыть и прочитать строку текстового файла в строке, вы можете использовать следующее:
// 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;
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 <fstream>
ifstream infile;
infile.open(**file path**);
while(!infile.eof())
{
getline(infile,data);
}
infile.close();
Следуйте шагам,
- Включите заголовочные файлы или пространство имен для доступа к классу файлов.
- Создайте объект класса File в зависимости от вашей платформы IDE (т. Е. CFile, QFile, fstream).
- Теперь вы можете легко найти методы этого класса для открытия / чтения / закрытия / getline или любого другого файла.
CFile/QFile/ifstream m_file; m_file.Open(path,Other parameter/mood to open file);
Для чтения файла вам нужно создать буфер или строку для сохранения данных, и вы можете передать эту переменную в метод 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;
}
}**