logo
Posobie_Cpp

6.1 Простой файловый ввод/вывод

Для использования файлов следует:

Имя объекта, предназначенного для работы с файлом, может быть любым, допустимым в С++. Например, fout, outFile, didi и т.д.

Рассмотрим возможные варианты работы с файлами на примерах. Вот так можно записать текст в файл.

fstream fin; // создаем объект класса fstream

fin.open("test",ios::in); // ставим ему в соответствие файл, открываем

//для чтения

fstream(fout);// допускается и такой тип объявления

fout.open (”a.dat”, ios::out); // а в этот файл будем записывать

char* str=”test string”;

fout>>str; // записываем строку в файл

// по окончанию работы с файлами, их следует закрыть:

fin.close();

fout.close();

В приведенном примере можно совместить объявление и инициализацию файловой переменной:

fstream fin("test",ios::in);

fstream fout(”a.dat”, ios::out);

Организовать корректное чтение из файла немного сложнее. Дело в том, что текстовый по типу файл заканчивается служебным символом eof – конец файла. При попытке прочесть информации больше, чем есть в файле, произойдет ошибка. Чтобы правильно произвести чтение из файла обычно используют цикл while() с проверкой конца файла встроенной функцией eof(). Следующий листинг показывает, как подсчитать количество символов в текстовом файле.

setlocale(LC_ALL,"Russian");

fstream fin("test.txt",ios::in);

char temp;

int counter=0;

while(!fin.eof()) // пока не конец файла

{

fin>>temp; //считываем символ в temp

counter++; //подсчет символов

}

cout<<”всего символов в файле равно ”<<counter<<endl;

При записи следует выполнить схожие действия. Предположим, в файле 1.txt содержится последовательность целых чисел. Следует переписать их в другой файл – 2.txt.

#include <fstream.h>

void main()

{

int temp, i=0;

fstream f("1.txt", ios::in);

fstream f2("2.txt", ios::out);

while(!f.eof) // чтение в цикле с проверкой конца файла

{

f>>temp;

i++;

f2<<i<<" - "<<temp<<endl;

}

f.close();

f2.close();

}

В следующем примере рассмотрен процесс «пузырьковой» сортировки элементов массива, которые считываются из одного файла, например, 1.txt и уже отсортированные по возрастанию записываются в другой файл (2.txt).

#include <fstream.h>

void main()

{

//Объявление вспомогательной переменной temp и счетчика,

//счетчик в начале равен нулю

int temp, counter=0;

//Открываем файл для чтения

fstream f("1.txt", ios::in);

while(!f.eof)

{

f>>temp;

counter++;

}

f.close();

//Объявление динамического массива типа int

// с количеством элементов counter

int *b=new int[counter];

// снова открываем файл и считываем числа в массив

f.open("1.txt", ios::in);

for(int i=0; i<counter; i++)

{

f>>b[i];

}

// мы последовательно сравниваем

// соседние элементы массива и, если надо, меняем их местами

// Сортировку повторить

// counter раз

for(i=0; i<counter-1; i++)

for(int j=i+1; j<counter; j++)

if(b[i]>b[j])

{

temp=b[i];

b[i]=b[j];

b[j]=temp;

}

//Открываем второй файл на запись

fstream f2("2.txt", ios::out);

//Выполняем запись в файл

for(i=0; i<counter; i++)

{

f2<<b[i]<<" ";

}

f.close();

f2.close();

}