Cum deschideți un fișier în C ++?

Vreau să deschid un fișier pentru citire, modul C ++. Trebuie să pot face acest lucru pentru:

  • fișierele text, care ar implica un fel de funcție de citire a liniei.

  • fișiere binare, care ar oferi o modalitate de a citi datele brute într-un tampon char * .

0
fr hi bn
adăugat autor mreggen, sursa
Oricine este interesat de RAII, ar trebui să verifice Pagina oficială a managementului resurselor de Bartosz Milewski.
adăugat autor titanae, sursa

8 răspunsuri

fstream sunt minunate, dar voi merge mai adânc și vă voi spune despre RAII .

Problema cu un exemplu clasic este că sunteți forțat să închideți fișierul singur, ceea ce înseamnă că va trebui să vă aplecați arhitectura la această nevoie. RAII utilizează apelul automat destructor în C ++ pentru a închide fișierul pentru tine.

Update: seems that std::fstream already implements RAII so the code below is useless. I'll keep it here for posterity and as an example of 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;
};

Acum puteți folosi această clasă în codul dvs. astfel:

int nsize = 10;
char *somedata;
ifstream myfile;
FileOpener opener(myfile, "");
myfile.read(somedata,nsize);
// myfile is closed automatically when opener destructor is called

Aflați cum funcționează RAII vă poate salva unele dureri de cap și unele bug-uri majore de gestionare a memoriei.

0
adăugat
Proiectele fluxului de fișiere se închid în distrugătorul lor, prin urmare această nouă clasă este inutilă.
adăugat autor Flame, sursa

Trebuie să utilizați ifstream dacă doriți doar pentru a citi (folosiți un ofstream pentru a scrie sau un fstream pentru ambele).

Pentru a deschide un fișier în modul text, procedați în felul următor:

ifstream in("filename.ext", ios_base::in);//the in flag is optional

Pentru a deschide un fișier în modul binar, trebuie doar să adăugați steagul "binar".

ifstream in2("filename2.ext", ios_base::in | ios_base::binary ); 

Utilizați funcția ifstream.read() pentru a citi un bloc de caractere (în modul binar sau text). Utilizați funcția getline() (aceasta este global) pentru a citi o întreagă linie.

0
adăugat
Roger, n-am găsit vreodată un caz în care aveam nevoie de steagul binar pe Windows sau Unix. În teorie, totuși, ar trebui să fie folosit pentru a evita conversiile implicite. stdcxx.apache.org/doc/stdlibug/30-4.html
adăugat autor Derek Park, sursa
Presupun că steagul binar este necesar doar într-un mediu Windows?
adăugat autor rogerdpack, sursa
+1 pentru a observa că funcția globală getline() trebuie utilizată în locul funcției membru.
adăugat autor foraidt, sursa

Pentru a deschide și a citi o linie de fișiere text pe linie, puteți utiliza următoarele:

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

Pentru a deschide și a citi un fișier binar, trebuie să declarați în mod explicit formatul de citire din fluxul de intrare pentru a fi binar și să citiți memoria care nu are interpretare explicită folosind funcția de membru al fluxului citește()

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

When doing this you'll need to #include the header :

Există trei moduri de a face acest lucru, în funcție de nevoile dvs. Ați putea folosi calea vechei școli C și apelați fopen/fread/fclose sau puteți utiliza facilitățile C ++ fstream (ifstream/instream) sau dacă utilizați MFC, utilizați clasa CFile, care oferă funcții pentru a realiza efectiv operațiunile de fișiere.

All of these are suitable for both text and binary, though none have a specific readline functionality. What you'd most likely do instead in that case is use the fstream classes (fstream.h) and use the stream operators (<< and >>) or the read function to read/write blocks of text:

int nsize = 10;
char *somedata;
ifstream myfile;
myfile.open("");
myfile.read(somedata,nsize);
myfile.close();

Rețineți că, dacă utilizați Visual Studio 2005 sau o versiune ulterioară, este posibil ca fluxul tradițional să nu fie disponibil (există o nouă implementare Microsoft, care este puțin diferită, dar realizează același lucru).

0
adăugat
N-ai avea o întrebare despre citire? Nu ai alocat spațiu pentru date. Ar trebui să fie char somedata [10] , nu?
adăugat autor swdev, sursa
#include 
#include 
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
adăugat
#include 
#include 
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;
}
0
adăugat
Puteți adăuga o scurtă explicație despre cum/de ce acest fragment de cod răspunde la întrebare?
adăugat autor mech, sursa
#include 

ifstream infile;
infile.open(**file path**);
while(!infile.eof())
{
   getline(infile,data);
}
infile.close();
0
adăugat
Ar trebui să explicați răspunsul dvs. fie înaintea codului, fie cu comentariile, astfel încât ceilalți oameni să poată înțelege ce încercați să faceți.
adăugat autor Michael, sursa

Urmareste pasii,

  1. Includeți fișierele Header sau spațiul de nume pentru a accesa clasa File.
  2. Faceți obiect clasă de fișiere În funcție de platforma dvs. IDE (adică, CFile, QFile, fstream).
  3. Acum puteți găsi cu ușurință acele metode de clasă pentru a deschide/read/close/getline sau altceva de orice fișier.
  CFile/QFile/ifstream m_file;
m_file.Open (cale, alt parametru/starea de spirit pentru a deschide fișierul);
 

Pentru citirea fișierului trebuie să creați tampon sau șir pentru a salva date și puteți trece acea variabilă în metoda read ().

0
adăugat