Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135

Работа с файлами

10.11.2021, 22:40. Показов 1113. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Помогите, пожалуйста, найти и исправить мои ошибки в коде (заменить на корректные, добавить, убрать неправильно используемые функции в моем решении).

Задание: Составить таблицу в файле, а потом вывести ее на экран. В первой процедуре вывести заголовок таблицы. Во второй рассчитать данные таблицы для первой строки. В третьей рассчитать данные для второй строки и т. д.. В последней процедуре вывести получившуюся таблицу из файла на экран.

Первая процедура (создание файла (или обнуление старых данных файла) и вывод заголовка таблицы в файл): Сначала с помощью функции assign(f, 'c:\file.txt') я создаю файл, потом с помощью функции rewrite(f) обнуляю его содержимое и начинаю заполнять новыми данными - write(), затем закрываю файл - close(f);

Вторая процедура (расчет данных и добавление результатов в таблицу, находящуюся в файле): Сначала открываю файл - assign(f, 'c:\file.txt'), потом добавляю в файл новые данные - write(f), затем закрываю файл - close(f);

С третьей и до предпоследней процедуры: аналогично второй;

Последняя процедура (вывод получившейся таблицы из файла на экран): Сначала открываю файл - assign(f, 'c:\file.txt'), потом перевожу его в режим чтения - reset(f), затем считываю все данные из файла read(f, а), затем вывожу их (таблицу на экран) - writeln(а) и закрываю файл - close(f).

Примерный вид программы:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
program raschet;
var f: file of char;
procedure zagolovok;
begin
   assign(f, 'c:\file.txt');
   rewrite(f);
   write('Товар', #10#13);
   write('Изделие   Стоимость', #10#13);
   close(f);
end;
procedure first;
var a, b, c: double;
begin
   a := 120.65;
   b := 23.01;
   c := a + b;
   assign(f, 'c:\file.txt');
   write('Дрель', c : 0 : 0, #10#13);
   close(f);
end;
procedure second;
var a, b, c: double;
begin
   a := 232.98;
   b := 105.76;
   c := a + b;
   assign(f, 'c:\file.txt');
   write('Шуруповерт', c : 0 : 0, #10#13);
   close(f);
end;
procedure third;
...
...
...
procedure n;
var a: char;
begin
   assign(f, 'c:\file.txt');
   reset(f);
   while (not Eof(f)) do
       begin
          read(f, a);
          writeln(a);
       end;
   close(f);
end;
begin
   zagolovok;
   first;
   second;
   ...
   ...
   ...
   n;
end.
Вычисления естественно другие, так как их много и они большие по объему (количеству строк), я решил их не писать. Они правильные - я отдельно их проделывал, только потом вставлял в основную программу.
Миниатюры
Работа с файлами  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.11.2021, 22:40
Ответы с готовыми решениями:

Работа со списками и файлами (Двусвязный список, структуры, работа с файлами)
1. Организовать ввод данных структуры и их вывод на экран. 2. Организовать ввод данных структуры из файла и их выгрузку в файл. 3....

Работа с файлами , хотелось бы с windows system файлами
всем привет, нужна интересная идея по программированию, работа с файлами , хотелось бы с windows system файлами, у вас есть какая-то идея?...

Работа с строками,Работа со структурными типами данных,Работа с файлами!!
Помогите написать программы для следующих заданий....буду очень благодарен.) 1)Разработать программу которая удаляет все слова в...

14
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
10.11.2021, 23:32
Чтобы писать в файл и явно не указывать конец строки #13#10:
Pascal
1
  WriteLn(f, ...);
Про отдельные процедуры для строк и переоткрытие файла на каждый чих - глупость какая-то.
1
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
10.11.2021, 23:48  [ТС]
Цитата Сообщение от bormant Посмотреть сообщение
Про отдельные процедуры для строк и переоткрытие файла на каждый чих - глупость какая-то.
bormant, я пишу программу, в которой нужно именно сделать отдельные процедуры вывода, если знаете как поправить, помогите, пожалуйста. Код выше я привел гораздо упрощеннее относительно того, что мне нужно сделать, чтобы разобраться в моих ошибках конкретно с употреблением файловых функций.

Из того, что Вы написали, я понял:

1. Файл надо открыть в первой программе, а закрыть в предпоследней (предполагаю).

2. Перепутал порядок #13 и #10.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
11.11.2021, 05:00
Maks Smirnov, для создания текстового файла служит rewrite, а для открытия для добавления append
Но это для текстовых…

А для file of char нужно переписывать файл заново!
… либо достигать конца файла и только тогда начинать в него писать.

Вообще, вы выбрали странный способ.

Зачем каждый раз писать assign(f, 'c:\file.txt');
У вас переменная f глобальная, значит можно один раз в начале основной программы связать её с файлом и всё!
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
11.11.2021, 09:08
Это хорошо, что вы описываете, что именно поняли из прочитанного. Плохо, что мне не удалось донести мысль кратким способом
Попробуем заменить WriteLn(f, нечто) словесным описанием того, что, как надеялся, должно было стать понятно.

1) в Паскале есть встроенные процедуры Write и WriteLn. Вторая отличается от первой тем, что дописывает после всего выведеного перевод на новую строку. Поэтому вместо Write(нечто, #13#10) обычно лучше писать WriteLn(нечто).
2) процедуры Write/WriteLn, если их первым параметром является не файловая переменная, выводят в файл "стандартного вывода". Если почитать про синтаксис старые описания языка, заметите, что эти файлы указывалисьв в описании заголовка программы (и достаточно давно такое указание ещё было обязательным)
program имя(input, output);
Но это я немного отвлёкся. То есть, Write(нечто) и WriteLn(нечто) на самом деле являются вызовами Write(output, нечто) и WriteLn(output, нечто).
У вас же при выводе в файл, а из задания следует, что процедуры должны выводить именно в файл, пропущена файловая переменная f, поэтому вывод будет не в файл f, а в файл стандартного вывода, который обычно связан с экранным вводом/выводом.

Все вот это мне было лень писать в прошлый раз, понадеялся, что все это станет очевидным пытливому уму из емкого:
WriteLn(f, ...);

Добавлено через 3 минуты
Про переоткрытие файла мысль раскрыл выше JuriiMW, не буду повторяться.

Добавлено через 6 минут
Про открытие закрытие:
- связать файловую переменную с файлом в начале программы или в отдельной процедуре,
- открыть файл в начале программы или в помянутой выше процедуре,
- закрыть файл в конце программы.

Стратегия открыть-записать-закрыть-повторить тоже используется, но в других случаях, например, при записи журналов/протоколов работы.
1
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
11.11.2021, 13:56  [ТС]
На данный момент мой код имеет такой вид:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
program extra;
Uses SysUtils;
var f: text;
procedure zagolovok;
begin
   rewrite(f);
   writeln(f, 'Товар');
   writeln(f, 'Изделие   Стоимость');
   close(f);
end;
procedure first;
var a, b, c: double;
begin
   a := 120.65;
   b := 23.01;
   c := a + b;
   append(f);
   write(f, 'Дрель');
   writeln(f, floattostr(c));
   close(f);
end;
procedure second;
var a, b, c: double;
begin
   a := 232.98;
   b := 105.76;
   c := a + b;
   append(f);
   write(f, 'Шуруповерт');
   writeln(f, floattostr(c));
   close(f);
end;
procedure n;
var a: string;
begin
   reset(f);
   while (not Eof(f)) do
   begin
     while (not Eoln(f)) do
     begin
       read(f, a);
       write(a);
     end;
     writeln;
   end;
   close(f);
end;
begin
   assign(f, 'c:\file.txt');
   zagolovok;
   first;
   second;
   n;
end.
Мои исправления:
1. поменял write(#13#10) на writeln;
2. изменил тип файла с символьного на текстовый - file of char -> text;
3. поменял тип переменной, которая выводит данные из файла на экран - char -> string;
4. сделал вещественное число типом string, чтобы вывести его в файл;
5. закрытия и открытия файла я решил оставить. В программе, которую я делаю, я считаю их необходимыми. Если их можно оставить, а я так понял, что это можно сделать, я воспользуюсь этой возможностью. Соответственно ввел в программу функцию - append(f);
6. функцию assign(f, 'c:\file.txt') вывел в основную программу.

Но у меня не исчезла проблема с тем, что вводимые мной слова и преобразованные вещественные числа имеют тип string, а функция вывода в файл требует тип char. JuriiMW, bormant, подскажите, пожалуйста, что еще нужно поправить, чтобы вывод стал корректным?
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
11.11.2021, 16:32
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
4. сделал вещественное число типом string, чтобы вывести его в файл;
— это лишнее
Если уж вы писали форматный вывод, то и здесь бы прокатило: writeln(f,c:0:2);

Первое приближение:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
const fName = 'file.txt';
 
var f: text;
 
procedure zagolovok;
begin
   rewrite(f);
   writeln(f, 'Товар');
   writeln(f, 'Изделие   Стоимость');
   close(f);
end;
 
procedure first;
var a, b, c: double;
begin
   a := 120.65;
   b := 23.01;
   c := a + b;
   append(f);
   writeln(f, 'Дрель', #32 c:0:2);
   close(f);
end;
 
procedure second;
var a, b, c: double;
begin
   a := 232.98;
   b := 105.76;
   c := a + b;
   append(f);
   write(f, 'Шуруповерт', #32, c:0:2);
   close(f);
end;
 
procedure n;
var s : string;
begin
   reset(f);
   while not Eof(f) do
     begin
       readln(f, s);
       writeln(s);
     end;
   close(f);
end;
 
begin
  assign(f, fName);
  zagolovok;
  first;
  second;
  n;
end.
Второе приближение:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
const fName = 'file.txt';
 
var f: text;
 
procedure zagolovok;
begin
   rewrite(f);
   writeln(f, 'Товар');
   writeln(f, 'Изделие   Стоимость');
   close(f);
end;
 
procedure addLine(name : String; cost : real);
begin
  Append(f); WriteLn(f, name, #32, cost:0:2); Close(f);
end;
 
procedure first;
const a = 120.65; b = 23.01;
begin
   addLine('Дрель', a+b);
end;
 
procedure second;
const a = 232.98; b = 105.76;
begin
   addLine('Шуруповерт', a+b);
end;
 
procedure n;
var s : string;
begin
   reset(f);
   while not Eof(f) do
     begin
       readln(f, s);
       writeln(s);
     end;
   close(f);
end;
 
begin
  assign(f, fName);
  zagolovok;
  first;
  second;
  n;
end.
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
11.11.2021, 16:33
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
Pascal
18
19
   write(f, 'Дрель');
   writeln(f, floattostr(c));
Здесь и далее это равносильно:
Pascal
18
   WriteLn(f, 'Дрель ',c);
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
Pascal
1
2
3
4
5
6
     while (not Eoln(f)) do
     begin
       read(f, a);
       write(a);
     end;
     writeln;
за малым исключением равносильно:
Pascal
1
  ReadLn(f,a); WriteLn(a);
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
не исчезла проблема с тем, что вводимые мной слова и преобразованные вещественные числа имеют тип string, а функция вывода в файл требует тип char
Нет такой проблемы, в т.ч. см. первый пример в этом сообщении.
1
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
11.11.2021, 16:35
bormant, упс!
Я раньше выложил решение… Соррян ;–)
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
11.11.2021, 16:58  [ТС]
JuriiMW, спасибо за редактирование кода.

bormant, спасибо за дополнительные пояснения.

Код работает, но появилась проблема - кодировка. У меня в среде программирования Lazarus настроена кодировка CP866. JuriiMW, bormant cкажите, пожалуйста, на какую кодировку надо поменять, чтобы слова отображались корректно?
Изображения
 
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
11.11.2021, 17:26  [ТС]
Нашел - CP1251.

Добавлено через 27 минут
Корректную кодировку для файла я нашел, но слова, которые появляются на экране пользователя до использования файла, исказились - им кодировка CP1251 не подходит. Получается, что для слов выводимых на экран пользователя напрямую корректна кодировка CP866, а для слов, попадающих на экран пользователя через файл CP1251.

JuriiMW, bormant, может можно как-то запрограммировать кодировку вводимых в файл слов?

Корректно или некорректно отображаются слова в файле мне не важно - он используется как хранилище информации, чтобы при вызове пользователем определенной процедуры, вывести всю информацию на экран, где информация должна быть отображена корректно.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
11.11.2021, 17:35
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
может можно как-то запрограммировать кодировку вводимых в файл слов?
См., например, Библиотека для поддержки кириллицы
или что-то аналогичное.
1
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
11.11.2021, 18:19  [ТС]
bormant, я так понял, что в моем случае, чтобы использовать Вашу функцию и не переделывать ее, мне нужно применить ее для слов, выводимых на экран пользователя до использования файла, кодировкой которых является CP866?

Ваша функция:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function cp866to1251(s: String): String;
var i: Integer;
begin
  for i := 1 to Length(s) do
    case s[i] of
    #0..#$7F: ;
    'А'..'п': Inc(s[i], $40);
    'р'..'я': Inc(s[i], $10);
    'Ё': s[i] := #$A8;
    'ё': s[i] := #$B8;
      else s[i] := ' ';
    end;
    cp866to1251 := s;
  end;
Если да, то в чем может быть проблема?

Pascal
1
writeln(cp866to1251('Меню:'));
Для самой программы я сделал кодировку CP1251 естественно.
Миниатюры
Работа с файлами  
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 135
11.11.2021, 18:27  [ТС]
Строка -
Pascal
1
write(cp866to1251('Запустить программу? (Да - "1", Нет - "0"): '));
А не -
Pascal
1
writeln(cp866to1251('Меню:'));
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
11.11.2021, 20:04
Цитата Сообщение от Maks Smirnov Посмотреть сообщение
Для самой программы я сделал кодировку CP1251 естественно
... и именно поэтому ничтоже сумняшеся решили переводить текст из 1251 в 866 используя правила трансляции из 866 в 1251? Серьезно? Ничего не перепутал? И после всего этого полученный результат вас удивил?

Добавлено через 11 минут
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function cp1251to866(s: String): String;
var i: Integer;
begin
  for i:=1 to Length(s) do
    case s[i] of
      #0..#$7F: ;
      #$C0..#$EF: {А..п} Dec(s[i],$40);
      #$F0..#$FF: {р..я} Dec(s[i],$10);
      #$A8: {Ё} s[i]:=#$F0;
      #$B8: {ё} s[i]:=#$F1;
      else s[i]:=' ';
    end;
  cp1251to866:=s;
end;
Добавлено через 8 минут
Но это так, необходимый минимум, на самом деле там несколько больше общих (присутствующих в обеих таблицах) символов, потому в том сообщении не только пример функции cp866to1251, но и ссылки какие-то, и буквы в виде слов, построенные в предложения таким образом, чтобы получился осмысленный текст.

Добавлено через 52 минуты
Ну и на случай непонятной кодировки исходника такой же независимый (и такой же неполноценный) вариант для 866->1251:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function cp866to1251(s: String): String;
var i: Integer;
begin
  for i:=1 to Length(s) do
    case s[i] of
      #0..#$7F: ;
      #$80..#$AF: {А..п} Inc(s[i],$40);
      #$E0..#$EF: {р..я} Inc(s[i],$10);
      #$F0: {Ё} s[i]:=#$A8;
      #$F1: {ё} s[i]:=#$B8;
      else s[i]:=' ';
    end;
  cp866to1251:=s;
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2021, 20:04
Помогаю со студенческими работами здесь

Работа с файлами. Работа со структурами и файлами Си
Написать программу вычисления стоимости покупки с учетом скидки. Скидка 3% предоставляется в случае, если сумма покупки больше 500 рублей,...

Работа с файлами(Запись,чтение,работа с данными)
Здравствуйте, никак не могу осилить файлы... Для начала вот само задание: В справочной автовокзала хранится расписание движения автобусов....

Лабораторная работа №5. Работа с файлами и алгоритмы сортировки
1. Написать функцию Load для считывания из текстового файла (например, Workers.txt) информации о работниках и заработной плате. В первой...

Работа с файлами и строками, работа с двумерными массивами
6. Составьте программу и блок-схему алгоритма обработки строки, находящейся в файле. Необходимо удалить из строки первое вхождение буквы...

Работа с файлами, чтение/работа со строкой
Доброго времени суток. Начал работать с C++ Builder 6. Есть текстовый файл .txt с различными строками, как можно производить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru