Frage

Ich möchte eine Datei öffnen, die für die Lektüre, die C++ so.Ich muss in der Lage sein, es zu tun für:

  • text-Dateien, die würde, um eine Art von Lesen Zeile-Funktion.

  • binäre Dateien, die würde bieten eine Möglichkeit zum Lesen von raw-Daten in eine char* Puffer.

War es hilfreich?

Lösung

Es gibt drei Möglichkeiten, dies zu tun, je nach Ihren Bedürfnissen.Sie könnte verwenden die old-school-C Weg und rufen fopen/fread/fclose, oder Sie könnte verwenden die C++ fstream sind Einrichtungen (ifstream/ofstream), oder wenn Sie MFC verwenden Sie die CFile-Klasse, die für Funktionen zu erreichen tatsächlichen Datei-Operationen.

Alle diese eignen sich sowohl für text-und binäre, obwohl keiner eine bestimmte readline-Funktionalität.Was würden Sie am ehesten zu tun, anstatt in diesem Fall ist die Verwendung der fstream sind Klassen (fstream sind.h), und verwenden Sie die stream-Operatoren (<< und >>) oder die lese-Funktion zum Lesen/schreiben Blöcke von text:

int nsize = 10;
char *somedata;
ifstream myfile;
myfile.open("<path to file>");
myfile.read(somedata,nsize);
myfile.close();

Beachten Sie, dass, wenn Sie Visual Studio 2005 oder höher, traditionelle fstream sind möglicherweise nicht verfügbar (es gibt eine neue Microsoft-Implementierung, die ist etwas anders, aber wird die gleiche Sache).

Andere Tipps

Benötigen Sie ein ifstream wenn Sie nur Lesen möchten (verwenden Sie ein ofstream um schreiben oder ein fstream für beide).

Zum öffnen einer Datei im text-Modus, tun die folgenden:

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

Zum öffnen einer Datei im binären Modus, Sie müssen nur hinzufügen die "binary" - flag.

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

Verwenden Sie die ifstream.read() Funktion liest einen block von Zeichen (in Binär-oder text-Modus).Verwenden Sie die getline() Funktion (es ist Globale) Lesen eine ganze Zeile.

Öffnen und Lesen einer Textdatei Zeile pro Zeile, könnten Sie Folgendes verwenden:

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

Öffnen und Lesen einer binären Datei müssen Sie ausdrücklich auf das Lesen-format in Ihren input-stream-binary-und lese-Speicher, hat keine eindeutige interpretation mithilfe von stream-Funktion Mitglied 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);

Wenn Sie dies tun müssen #include der header : <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......
}

Befolgen Sie die Schritte,

  1. Include-Header-Dateien oder name-space, um Zugriff Datei Klasse.
  2. Die File-Klasse, Objekt, Je nach Ihrer IDE-Plattform ( ich.e, CFile,QFile,fstream sind).
  3. Jetzt können Sie leicht feststellen, die Klasse Methoden zum öffnen/Lesen/schließen/getline oder sonst einer Datei.
CFile/QFile/ifstream m_file;
m_file.Open(path,Other parameter/mood to open file);

Für das Lesen von Datei Sie haben, um einen Puffer oder Schnur, um Daten zu speichern, und übergeben Sie die variable in der read () - Methode.

**#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 sind groß, aber ich werde ein wenig tiefer und Ihnen sagen, über RAII.

Das problem ist ein klassisches Beispiel ist, dass Sie gezwungen sind, schließen Sie die Datei selbst, was bedeutet, dass Sie haben zu biegen Ihre Architektur, um dies benötigen.RAII macht der automatischen Destruktor-Aufruf in C++, die Datei zu schließen für Sie.

Update:scheint, dass std::fstream sind bereits implementiert RAII also, der code unten ist nutzlos.Ich halte es hier für die Nachwelt und als ein Beispiel für 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;
};

Sie können jetzt verwenden Sie diese Klasse in Ihrem code wie diese:

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

Lernen, wie RAII arbeiten können, sparen Sie sich einige Kopfschmerzen und einige größere memory-management-Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top