Вопрос

Я хочу открыть файл для чтения способом C++.Мне нужно иметь возможность сделать это для:

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

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

Это было полезно?

Решение

Есть три способа сделать это, в зависимости от ваших потребностей.Вы можете использовать метод старой школы C и вызвать fopen/fread/fclose, или вы можете использовать возможности C++ 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, которая немного отличается, но выполняет то же самое).

Другие советы

Вам нужно использовать 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;

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

Следуйте шагам,

  1. Включите файлы заголовков или пространство имен для доступа к классу файлов.
  2. Сделайте объект класса файлов в зависимости от вашей платформы IDE (то есть CFILE, QFILE, FSTREAM).
  3. Теперь вы можете легко найти методы класса для открытия/чтения/закрытия/получения строки или любого другого файла.
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;
}
}**
#include <fstream>

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

fstream — это здорово, но я углублюсь и расскажу вам о РАИИ.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top