На этом шаге мы рассмотрим пример использования потоковых классов для организации доступа к файлам.
Следующая программа открывает файл charset.out и записывает в него текущий набор символов (все символы в интервале 32-255):
//--------------------------------------------------------------------------- #include <vcl.h> #include <string> // Строки #include <iostream> // Ввод-вывод #include <fstream> // Файловый ввод-вывод #include <iomanip> // setw() #include <cstdlib> // exit() #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } // Опережающие объявления void writeCharsetToFile (const string& filename); void outputFile (const string& filename); int main (int argc, char* argv[]) { writeCharsetToFile("charset.out"); outputFile("charset.out"); cout << ToRus("Работа выполнена"); getch(); return 0; } void writeCharsetToFile (const string& filename) { // Открытие выходного файла ofstream file(filename.c_str()); // Файл открыт? if (! file) { // НЕТ, аварийное завершение программы cerr << ToRus("Не могу открыть файл \"") << filename << "\"" << endl; exit(EXIT_FAILURE); } // Вывод текущего набора символов for (int i=32; i<256; i++) { file << ToRus("Значение: ") << setw(3) << i << " " << ToRus("Символ: ") << static_cast<char>(i) << endl; } } // Автоматическое закрытие файла void outputFile (const string& filename) { // open input file ifstream file(filename.c_str()); // Файл открыт? if (! file) { // НЕТ, аварийное завершение программы cerr << ToRus("Не могу открыть файл \"") << filename << "\"" << endl; exit(EXIT_FAILURE); } // Копирование содержимого файла в cout char c; while (file.get(c)) { cout.put(c); } } // Автоматическое закрытие файла //---------------------------------------------------------------------------
Текст этого примера можно взять 190 шаг)
или auto_ptr (смотри 59 шаг).
Вместо последовательного вывода отдельных символов также можно вывести все содержимое файла одной командой, передавая указатель на потоковый буфер
файла в аргументе оператора <<:
std::cout << file.rdbuf();
На следующем шаге мы рассмотрим режимы открытия файлов.