Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
result_2011_10_24.docx
Скачиваний:
2
Добавлен:
14.11.2018
Размер:
1.14 Mб
Скачать

Задача 13 (2 способ решения): Из файла удалить слова, в которых содержатся хотя бы одна буква предпоследней строки.

Размышления о ходе решения задачи.

  1. Первые четыре шага аналогичны первым четырем шагам в задаче 12 (1 способ решения). Для работы с файлами воспользуемся потоками. Отметим, что обработка строки аналогичная обработке строки в первом способе решения задачи.

  2. Возникает вопрос о том, как найти последнуюю строку. Если потоки позволяют считывать построчно, то надо считывать построчно, пока не закончится файл. Последняя считанная строка в файле будет последней. И для выполнения этого действия потребуедтся проход по всему файлу. В виде кодов эта реализация будет выглядить следующим образом:

public string findLastString(string inFileName) {

string res = "";

using (StreamReader reader = File.OpenText(inFileName)) {

if (reader.Peek() < 0) {

return res;

}

res = reader.ReadLine();

}

return res;

}

  1. После этого (первого прохода по файлу) у нас будет последняя строка. Все остальное решение будет аналогично решение задачи 11 (2 способ).

public class FileWorker {

public string findLastString(string inFileName) {

string res = "";

using (StreamReader reader = File.OpenText(inFileName)) {

if (reader.Peek() < 0) {

return res;

}

res = reader.ReadLine();

}

return res;

}

public void processFile(string inFileName, string outFileName) {

try {

string lastLine = findLastString(inFileName);

using (StreamReader reader = File.OpenText(inFileName)) {

using (StreamWriter writer = File.CreateText(outFileName)) {

while (true) {

if (reader.Peek() < 0) {

break;

}

string tempStr = reader.ReadLine();

StringWorker worker = new StringWorker();

worker.str = tempStr;

worker.processString(lastLine);

writer.WriteLine(worker.str);

}

}

}

} catch {

Console.WriteLine("ошибка");

}

}

}

  1. И приведем полный код программы.

using System;

using System.IO;

using System.Linq;

namespace ConsoleApplication17 {

class Program {

static void Main() {

Console.WriteLine("введите имя входного файла: ");

string inFileName = Console.ReadLine();

Console.WriteLine("введите имя выходного файла: ");

string outFileName = Console.ReadLine();

FileWorker fileWorker = new FileWorker();

fileWorker.processFile(inFileName, outFileName);

}

}

public class StringWorker {

public string str;

public bool needDelWord(string word, string lastStr) {

for (int i = 0; i < word.Length; i++) {

if (lastStr.Contains(word[i])) {

return true;

}

}

return false;

}

private bool isSeparator(char c) {

string oneCharStr = "" + c;

return " .,?!".Contains(oneCharStr);

}

public int getWordLength(int index) {

int res = 0;

for (int i = index; i < str.Length; i++) {

if (isSeparator(str[i])) {

break;

}

res = res + 1;

}

return res;

}

public void processString(string lastStr) {

for (int i = 0; i < str.Length; i++) {

if (isSeparator(str[i])) {

continue;

}

int len = getWordLength(i);

string word = str.Substring(i, len);

if (needDelWord(word, lastStr)) {

str = str.Remove(i, len);

} else {

i = i + len;

}

}

}

}

public class FileWorker {

public string findLastString(string inFileName) {

string res = "";

using (StreamReader reader = File.OpenText(inFileName)) {

if (reader.Peek() < 0) {

return res;

}

res = reader.ReadLine();

}

return res;

}

public void processFile(string inFileName, string outFileName) {

try {

string lastLine = findLastString(inFileName);

using (StreamReader reader = File.OpenText(inFileName)) {

using (StreamWriter writer = File.CreateText(outFileName)) {

while (true) {

if (reader.Peek() < 0) {

break;

}

string tempStr = reader.ReadLine();

StringWorker worker = new StringWorker();

worker.str = tempStr;

worker.processString(lastLine);

writer.WriteLine(worker.str);

}

}

}

} catch {

Console.WriteLine("ошибка");

}

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]