2008-08-11 22 views
19

Ich möchte eine Datei zum Lesen öffnen, die C++ Art und Weise. Ich muss in der Lage sein, es zu tun für:Wie öffne ich eine Datei in C++?

  • Textdateien, die eine Art Leselinienfunktion beinhalten würde.

  • Binärdateien, die eine Möglichkeit bieten würden, Rohdaten in einen char* Puffer zu lesen.

+1

[C++: Input/Output mit Dateien] (http://www.cplusplus.com/doc/tutorial/files.html) – mreggen

+0

Wer Interesse an RAII, sollte überprüfen [offizielles Resource Management Page] (http://www.relisoft.com/resource/resmain.html) von Bartosz Milewski. – titanae

Antwort

8

Je nach Bedarf gibt es drei Möglichkeiten, dies zu tun. Sie könnten die Oldschool-C-Methode verwenden und fopen/fread/fclose aufrufen, oder Sie könnten die C++ - fstream-Funktionen (ifstream/ofstream) verwenden, oder wenn Sie MFC verwenden, verwenden Sie die CFile-Klasse, die Funktionen zur Verfügung stellt Dateioperationen.

Alle diese sind für Text und Binär geeignet, obwohl keiner eine spezifische readline Funktionalität hat. Was würden Sie am ehesten tun, anstatt in diesem Fall ist die fstream Klassen verwenden (fstream.h) und verwenden Sie die Stream-Operatoren (< < und >>) oder die Lesefunktion/Schreib-Textblöcke zu lesen:

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 verwenden, das traditionelle fstream möglicherweise nicht verfügbar ist (es gibt eine neue Microsoft-Implementierung, die etwas anders ist, aber das Gleiche erreicht).

+6

Würden Sie beim Lesen keinen Fehler bekommen? Sie haben keinen Speicherplatz für die Daten reserviert. Sollte "Char Somedata [10]" sein, oder? – swdev

24

Sie müssen eine ifstream verwenden, wenn Sie nur lesen möchten (verwenden Sie eine ofstream zum Schreiben oder eine fstream für beide).

Um eine Datei im Textmodus zu öffnen, gehen Sie wie folgt vor:

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

eine Datei im Binär-Modus zu öffnen, müssen Sie nur den „binären“ Flag hinzuzufügen.

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

über die Funktion ifstream.read() einen Block von Zeichen (im Binär- oder Textmodus) zu lesen. Verwenden Sie die Funktion getline() (es ist global), um eine ganze Zeile zu lesen.

+0

+1 für die Feststellung, dass die globale Funktion getline() anstelle der Elementfunktion verwendet werden soll. – foraidt

+0

Ich nehme an, das binäre Flag wird nur in einer Windows-Umgebung benötigt? – rogerdpack

+0

Roger, ich habe nie einen Fall gefunden, wo ich das binäre Flag unter Windows oder Unix brauchte. In der Theorie sollte es jedoch verwendet werden, um implizite Konvertierungen zu vermeiden. http://stdcxx.apache.org/doc/stdlibug/30-4.html –

-2

fstream sind großartig, aber ich werde ein wenig tiefer gehen und Ihnen über RAII erzählen.

Das Problem mit einem klassischen Beispiel ist, dass Sie gezwungen sind, die Datei selbst zu schließen, was bedeutet, dass Sie Ihre Architektur an diese Notwendigkeit anpassen müssen. RAII verwendet den automatischen Destruktoraufruf in C++, um die Datei für Sie zu schließen.

Update: scheint, dass std :: fstream bereits RAII implementiert, so dass der folgende Code nutzlos ist. Ich werde es hier für die Nachwelt aufbewahren und als Beispiel für RAII.

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 Sie einige Kopfschmerzen sparen und einige große Speicherverwaltung Fehler:

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 nun diese Klasse in Ihrem Code 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); 
} 

Zum Öffnen und Lesen eine binäre Datei, die Sie explizit benötigen das Leseformat in Ihrem Eingangsstrom zu erklären:

+4

Datei-Stream-Objekte werden in ihrem Destruktor geschlossen, daher ist diese neue Klasse nutzlos. – Flame

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

zu öffnen und eine Textdatei Zeile für Zeile zu lesen, können Sie die folgenden verwenden werden binär und Lese-Speicher, der read() keine explizite Auslegung mit Strom Memberfunktion hat:

// 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 dies tun Sie zubrauchender Header: <iostream>