- •Содержание Введение
- •Задача 1: Обнаружить учетку памяти
- •Задача 2. Составить тесты к программе
- •Задача 3: Напечатать все содержимое файла на экран.
- •Задача 3: Напечатать все содержимое файла на экран (оптимизация).
- •Задача 4. Удалить все нечетные элементы из массива
- •Задача4.Удалить все нечетные элементы из массива (оптимизация)
- •Задача 4. Удалить все нечетные элементы из массива (последующая оптимизация)
- •Задача 4. Удалить все нечетные элементы из массива (основа тестов)
- •Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой
- •Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой (без использования потоков и std::string)
- •Задача 6. Удалить строки, в которых есть два одинаковых элемента (без использования std::vector)
- •Задача 6. Удалить строки, в которых есть два одинаковых элемента (c использованием std::vector)
- •Задача 7. Отсортировать содержимое словаря
- •Задача 8. Реализовать сохранение и загрузку пользовательских структур данных с использованием fstream
- •Заключение Глоссарий
- •Список рекомендуемой литературы
Задача 3: Напечатать все содержимое файла на экран.
Рассуждения:
Для того, что бы напечать все содержимое на экран необходимо знать имя файла. Очевидно, что имя файла – это строка. Поэтому блок кода для получения имени файла будет выглядить следующим образом:
cout << "enter filename: " << flush;
string dictionary_name;
cin >> dictionary_name;
После получение имени файла его надо попробовать открыть. Следует отметить, что в языке С++ существует тип ifstream, что в расшифровке означает «input file stream», т.е. поток чтения. Успешность открытия потока можно проверить с помощью функции is_open. Однако при Поэтому следующий блок кода для проверки корректности открытия файла будет выглядить следующим образом:
ifstream ifs(dictionary_name);
if(!ifs.is_open()) {
cout << "Could not open file: "<< dictionary_name << endl;
return1;
}
Содержимое файла – множество строк. Следует отметить, что в данном случае под множеством понимается не «классическое» множество из курса математических дисциплин, а то, что в нем содержится несколько строк.
Раз у нас есть множество строк в файле, то необходимо пройти по нему. Вознимает вопрос – сколько раз надо пройти по файлу? Ответ на вопрос весьма логичен – пока не дойдем до конца файла. Для определения того, дошли до конца файла или нет, можно воспользоваться функцией eof, которая есть у ifstream (в нашем случае это переменная ifs).
Естественно после окончания работы необходимо закрыть поток из файла. Это можно делать с помощью функции close.
Саму строку из файла можно прочитать с помощью функции getline(). Следует отметить, что использование оператора >> при чтении из потока прочитает данные до первого проблела, поэтому в данной задаче этот оператор нам не подходит.
Тогда алгоритм чтения всех строк будет выглядить:
//здесь будем хранить строки
vector<string> lines;
//пока не дошли до конца файла
while (ifs.eof() == false) {
string curLine;
getline(ifs, curLine);
lines.push_back(curLine);
}
ifs.close();
И теперь осталось только вывести все строки на экран. Для того, что бы определить, сколько строк находится в векторе, можно воспользоваться функцией size(). Алгоритм вывода будет следующим:
for (int i = 0; i < lines.size(); i++) {
cout << lines[i] << endl;
}
Приведем полный код решения задачи:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main() {
//ввод имени файла
cout << "enter filename: " << flush;
string dictionary_name;
//dictionary_name = "D:\\sample.txt";
cin >> dictionary_name;
//открытие файла
ifstream ifs(dictionary_name);
//проверка на корректность открытия файла
if (!ifs.is_open()) {
cout << "Could not open file: " << dictionary_name <<endl;
return 1;
}
//здесь будем хранить строки
vector<string> lines;
//пока не дошли до конца файла
while (ifs.eof() == false) {
string curLine;
getline(ifs, curLine);
lines.push_back(curLine);
}
ifs.close();
cout << endl;
for (int i = 0; i < lines.size(); i++) {
cout << lines[i] << endl;
}
cout << "----- file end -------" << endl << "press enter";
char z;
cin.get(z);
return 0;
}