To tylko jedna z 4 stron tej notatki. Zaloguj się aby zobaczyć ten dokument.
Zobacz
całą notatkę
Przetwarzanie plików
Visual C++ 6.0
Przetwarzanie plików odbywa się za pośrednictwem zmiennych strumieniowych klas ifstream i ofstream, zadeklarowanych w nagłówku fstream.h. Po utworzeniu zmiennej strumieniowej należy otworzyć skojarzony z nią plik, a następnie upewnić się, że otwarcie było pomyślne. Po pomyślnym otwarciu pliku, pochodzący z niego strumień danych można przetwarzać w taki sam sposób, jak strumień danych związany z klawiaturą albo z monitorem.
Stany strumienia
Początkowo strumień znajduje się w stanie dobrym, ale na skutek błędu operacji wejścia-wyjścia albo próby wprowadzenia nieistniejącej danej, może znaleźć się w stanie nie-dobrym (fail). W stanie nie-dobrym wszystkie operacje na strumieniu są ignorowane. Jeśli dane przygotowano właściwie, a jakość pamięci zewnętrznej jest zadowalająca, to stan nie-dobry oznacza, że napotkano koniec strumienia. Uwaga: W programach przykładowych nie będzie rozpatrywany przypadek wystąpienia błędu przesyłania danych. Szczególnym przypadkiem stanu nie-dobrego jest stan zły (bad). Powstaje on w przypadku rozpoznania danych o złym formacie. Niestety, na skutek niefortunnych domniemań, wprowadzenie takiej "danej" jak 3e, zamiast 3e0 (w kontekście 3ex) nie zmienia stanu strumienia na zły.
Uwaga: Do sprawdzenia czy stan strumienia jest zły, służy funkcja bad, a do sprawdzenia, czy strumień znajduje się w pozycji za końcem pliku, służy funkcja eof. Funkcji tych używa się bardzo rzadko.
Zmienna plikowa
Jeśli w miejscu wystąpienia operacji wejścia-wyjścia odbywa się takie badanie zmiennej plikowej, jakby dotyczyło wyrażenia o wartości orzecznikowej, na przykład
while(cin num) ...
albo
if(cin) ...
to w stanie dobrym jest dostarczana wartość true, a w stanie nie-dobrym wartość false.
Wprowadzanie danych
Zmienna strumieniowa użyta do wprowadzania danych z pliku jest typu ifstream. Otwarcie pliku odbywa się za pomocą funkcji open, której pierwszym argumentem jest nazwa, a drugim tryb otwarcia pliku: ios::in. Jeśli otwierany plik nie istnieje, to zostanie utworzony jako pusty. Aby tego uniknąć, plik należy otworzyć w trybie ios::in | ios::nocreate.
Do zbadania, czy otwarcie pliku się powiodło, służy funkcja is_open. Jej rezultat ma wartość nie-zero tylko wówczas, gdy otwarcie było pomyślne.
#include
#include
#include
(…)
…::nocreate);
if(!inp.is_open()) {
cout << "File does not exist" << endl;
return -1;
}
int val;
while(inp >> val) // wprowadź i sprawdź stan
sum += val; // dosumuj
assert(!inp.bad()); // raczej zbędne
cout << "Sum = " << sum << endl;
return 0;
}
Wykonanie programu powoduje wyprowadzenie sumy liczb całkowitych zawartych w pliku Data.txt.
Wywołanie funkcji assert ma na celu upewnienie się, że strumień…
…("Data2.txt", ios::out);
if(!out.is_open()) {
cout << "Target not opened" << endl;
return -1;
}
int val;
while(inp >> val)
out << val << endl;
cout << "Done!" << endl;
return 0;
}
Program kopiuje liczby całkowite z pliku Data.txt do pliku Data2.txt. Każdą kopiowaną liczbę umieszcza w nowym wierszu.
Użycie klawiatury
Jeśli dane wprowadza się z klawiatury, to koniec strumienia określa się za pomocą znaku…
…. Jeśli już istnieje, to zostanie otworzony jako pusty.
Do zbadania, czy otwarcie pliku się powiodło, służy funkcja is_open. Jej rezultat ma wartość nie-zero tylko wówczas, gdy otwarcie było pomyślne.
#include <iostream.h>
#include <fstream.h>
int main(void)
{
ifstream inp;
inp.open("Data.txt", ios::in | ios::nocreate);
if(!inp.is_open()) {
cout << "Source does not exist" << endl;
return -1;
}
ofstream out;
out.open…
... zobacz całą notatkę
Komentarze użytkowników (0)