Как вы открываете файл в C ++?

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

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

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

11.08.2008 15:50:51
mreggen 11.08.2008 15:53:34
Любой, кто интересуется RAII, должен посетить официальную страницу управления ресурсами Бартоша Милевского.
titanae 8.09.2008 12:43:12
9 ОТВЕТОВ
РЕШЕНИЕ

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

9
11.08.2008 15:58:06
Разве вы не получили бы segfault на чтение? Вы не выделяли место для данных. Должно быть char somedata[10], верно?
swdev 16.09.2013 08:30:38

Вам нужно использовать, 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()функцию (она глобальная), чтобы прочитать всю строку.

31
16.09.2013 08:24:39
+1 за то, что отметили, что вместо функции-члена должна использоваться глобальная функция getline ().
foraidt 14.08.2009 16:57:02
Я предполагаю, что двоичный флаг нужен только в среде Windows?
rogerdpack 30.04.2010 20:21:56
Роджер, я никогда не находил случая, когда мне нужен бинарный флаг в Windows или Unix. В теории, однако, это должно использоваться, чтобы избежать любых неявных преобразований. stdcxx.apache.org/doc/stdlibug/30-4.html
Derek Park 9.07.2010 23:17:25

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

-2
5.10.2015 15:43:58
Объекты файлового потока закрываются в своем деструкторе, поэтому этот новый класс бесполезен.
Flame 19.09.2008 20:29:50
#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......
}
0
14.12.2015 12:03:05

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

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

2
14.12.2015 13:18:24
#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;
}
1
29.03.2018 19:04:35
Не могли бы вы добавить краткое объяснение того, как / почему этот фрагмент кода отвечает на вопрос?
mech 29.03.2018 19:30:04
#include <fstream>

ifstream infile;
infile.open(**file path**);
while(!infile.eof())
{
   getline(infile,data);
}
infile.close();
-1
29.03.2018 20:15:06
Вы должны объяснить свой ответ либо перед кодом, либо с комментариями, чтобы другие люди могли понять, что вы пытаетесь сделать.
Michael 29.03.2018 20:46:23

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

  1. Включите заголовочные файлы или пространство имен для доступа к классу файлов.
  2. Создайте объект класса File в зависимости от вашей платформы IDE (т. Е. CFile, QFile, fstream).
  3. Теперь вы можете легко найти методы этого класса для открытия / чтения / закрытия / getline или любого другого файла.
CFile/QFile/ifstream m_file;
m_file.Open(path,Other parameter/mood to open file);

Для чтения файла вам нужно создать буфер или строку для сохранения данных, и вы можете передать эту переменную в метод read ().

0
26.04.2018 12:34:32
**#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;
}
}**
0
13.04.2019 08:54:48