Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2012, 11:01   #1
RakNaGore
Пользователь
 
Регистрация: 10.07.2011
Сообщений: 12
Восклицание Работа с типизироваными файлами (Pascal)

Задание:
Цитата:
Написать программу с процедурами по работе с файлами.
Проблема:
Цитата:
Процедура ShowCountryInfo. Процедура записи в файл отрабатывает нормально, а дальше в файл пишется по-видимому что-то не то и вместо информации отображается тарабарщина.
Прошу пока не обращать внимания на остальные возможные ошибки.
Код:
Program AsAlwaysTest;
Uses
 Crt;

TYPE
 Money = 1..1000000;
 TCountry =
  record
   Name : string[30];
   Capital : string[20];
   Funds, people : money;
   Independent, InWar : boolean;
  end;
 TFile = file of TCountry;

VAR
 MyFile : TFile;
 n, pos : integer;

Procedure GetCountryInfo(MyCountry : TCountry);
var
 yn : char;
begin
 with MyCountry do
 begin
  Write('Enter name of country: '); ReadLn(Name);
  Write('Enter capital of ', Name, ': '); ReadLn(Capital);
  Write('People, funds: '); ReadLn(People, Funds);
  Write('Is ', Name,  ' independent? (y/n) '); ReadLn(yn); if yn = 'y' then Independent := true else Independent := false;
  Write('Is ', Name,  ' in war? (y/n) '); ReadLn(yn); if yn = 'y' then InWar := true else InWar := false;
 end;
end;

Procedure AddToFile(n : integer; var FileName : TFile);
var
 i, pos : integer;
 OneMoreCountry : TCountry;
begin
 ReWrite(FileName);
 for i := 1 to n do
 begin
  GetCountryInfo(OneMoreCountry); Write('Input position: '); ReadLn(Pos);
  Seek(FileName, pos);
  Write(FileName, OneMoreCountry);
 end;
 Close(FileName);
end;

Procedure AddToEndOfFile(n : integer; var FileName : TFile);
var
 i : integer;
 OneMoreCountry : TCountry;
begin
 for i := 1 to n do
 begin
  Reset(FileName);
  GetCountryInfo(OneMoreCountry);
  Seek(FileName, FileSize(FileName));
  Write(FileName, OneMoreCountry);
 end;
 Close(FileName);
end;

Procedure AddToEndOfFile1(var FileName : TFile);
begin
 AddToEndOfFile(1, FileName);
end;

Procedure DeleteFromFile(var FileName : TFile; pos : integer);
var
 i : integer;
 temp : TCountry;
begin
 Reset(FileName);
 for i := pos to FileSize(FileName) - 1 do
 begin
  Seek(FileName, i + 1);
  Read(FileName, Temp);
  Seek(FileName, i);
  Write(FileName, Temp);
 end;
 Seek(FileName, FileSize(FileName) - 2);
 Truncate(FileName);
 Close(FileName);
end;

Procedure DeleteFromBeginOfFile(var FileName : TFile);
begin
 DeleteFromFile(FileName, 1);
end;

Procedure DeleteFromFileByPos(n : integer; var FileName : TFile; pos : integer);
var
 i : integer;
begin
 for i := 1 to n do DeleteFromFile(FileName, pos);
end;

Procedure ShowCountryInfo(OneMoreCountry : TCountry);
var
 phrase : string[7];
begin
 with OneMoreCountry do
 begin
  WriteLn('Name of country: ', Name);
  WriteLn('The capital of ', Name, ' is ', Capital);
  WriteLn('Funds: ', Funds, '$'); WriteLn('Popultaion: about ', People, ' people');
  if Independent = true then phrase := '' else phrase := 'not ';
  WriteLn(Name, ' is ', phrase, 'independent');
  if InWar = true then phrase := '' else phrase := 'not ';
  WriteLn(Name, ' is ', phrase, 'in war');
 end;
end;

Procedure LoadFromFileToScreen(var FileName : TFile; pos : integer);
var
 i : integer;
 OneMoreCountry : TCountry;
begin
 Reset(FileName);
 for i := pos to FileSize(FileName) - 1 do
 begin
  Seek(FileName, i);
  Read(FileName, OneMoreCountry);
  ShowCountryInfo(OneMoreCountry);
 end;
 Close(FileName);
end;

BEGIN
 ClrScr; assign(MyFile, 'countries.txt');
 Write('How many countries: '); ReadLn(n);
 AddToFile(n, MyFile); WriteLn('Succesfully added'); WriteLn;
 LoadFromFileToScreen(MyFile, 0); ReadLn;
 Write('How many countries to end of file: '); ReadLn(n);
 AddToEndOfFile(n, MyFile); LoadFromFileToScreen(MyFile, 0); ReadLn;
 Write('How many files to delete: '); ReadLn(n);
 Write('Choose position: '); ReadLn(pos); DeleteFromFileByPos(n, MyFile, pos); LoadFromFileToScreen(MyFile, 0);
 WriteLn('And now I am going to delete one record from the beginning of file');
 DeleteFromBeginOfFile(MyFile); LoadFromFileToScreen(MyFile, 0);
 ReadLn
END.
RakNaGore вне форума Ответить с цитированием
Старый 27.01.2012, 12:42   #2
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Выложи пример содержания countries.txt
Цитата:
Процедура ShowCountryInfo. Процедура записи в файл отрабатывает нормально, а дальше в файл пишется по-видимому что-то не то и вместо информации отображается тарабарщина.
ShowCountryInfo вообще ниче в файл не пишет. И не читает из файла тоже. Попробуй вопрос сформулировать понятнее.

Кстати, если ты открываешь "file of TCountry" тем же notepad'ом, то там тарабарщина и должна быть.
Все тривиальное просто

Последний раз редактировалось whatever; 27.01.2012 в 12:50.
whatever вне форума Ответить с цитированием
Старый 27.01.2012, 20:34   #3
RakNaGore
Пользователь
 
Регистрация: 10.07.2011
Сообщений: 12
Восклицание

Точка после ShowCountryInfo стоит не зря, это конец предложения. А до этого жирным шрифтом написано слово "проблема". Тарабарщина должна быть в файле, а не при отображении в самой программе. И даже если она в файле есть, то между ней проскакивают данные, которые я вводил. При этом Borland Pascal сопровождает каждый вЫвод отвратительным пищанием спикера, а Free Pascal молча, но тоже, как и BP показывает кракозябли.

До этого писал программы по работе с файлами, ну, допустим, немного другие типы полей в record, но это по-моему не важно. Всё работало отлично. Единственное, что новое - это записи типа boolean. Поэтому подозрение падает только на них.

Прилагаю countries.txt и диалог с программой.
Изображения
Тип файла: jpg pic.jpg (72.5 Кб, 23 просмотров)
Вложения
Тип файла: txt countries.txt (128 байт, 144 просмотров)

Последний раз редактировалось RakNaGore; 27.01.2012 в 20:40.
RakNaGore вне форума Ответить с цитированием
Старый 28.01.2012, 00:43   #4
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Во-первых, не надо умничать. Просто смирись с тем, что не можешь нормально задать вопрос, тут нет экстрасенсов, чтобы понимать "намеками".

Во-вторых, все гораздо проще, "буличи" тут не при чем:
Код:
Program AsAlwaysTest;
Uses
 Crt;

TYPE
 Money = 1..1000000;
 TCountry =
  record
   Name : string[30];
   Capital : string[20];
   Funds, people : money;
   Independent, InWar : boolean;
  end;
 TFile = file of TCountry;

VAR
 MyFile : TFile;
 n, pos : integer;

Procedure GetCountryInfo(var MyCountry : TCountry);  // var !!!
var
 yn : char;
begin
 with MyCountry do
 begin
  Write('Enter name of country: '); ReadLn(Name);
  Write('Enter capital of ', Name, ': '); ReadLn(Capital);
  Write('People, funds: '); ReadLn(People, Funds);
  Write('Is ', Name,  ' independent? (y/n) '); ReadLn(yn); if yn = 'y' then Independent := true else Independent := false;
  Write('Is ', Name,  ' in war? (y/n) '); ReadLn(yn); if yn = 'y' then InWar := true else InWar := false;
 end;
end;

Procedure AddToFile(n : integer; var FileName : TFile);
var
 i, pos : integer;
 OneMoreCountry : TCountry;
begin
 ReWrite(FileName);// во-во
 for i := 1 to n do
 begin
  GetCountryInfo(OneMoreCountry); Write('Input position: '); ReadLn(Pos);
  Seek(FileName, pos);
  Write(FileName, OneMoreCountry);
 end;
 Close(FileName);
end;

Procedure AddToEndOfFile(n : integer; var FileName : TFile);
var
 i : integer;
 OneMoreCountry : TCountry;
begin
 for i := 1 to n do
 begin
  Reset(FileName);// да ну?
  GetCountryInfo(OneMoreCountry);
  Seek(FileName, FileSize(FileName));
  Write(FileName, OneMoreCountry);
 end;
 Close(FileName);
end;

Procedure AddToEndOfFile1(var FileName : TFile);
begin
 AddToEndOfFile(1, FileName);
end;

Procedure DeleteFromFile(var FileName : TFile; pos : integer);
var
 i : integer;
 temp : TCountry;
begin
 Reset(FileName); // а если подумать??
 for i := pos to FileSize(FileName) - 1 do
 begin
  Seek(FileName, i + 1);
  Read(FileName, Temp);
  Seek(FileName, i);
  Write(FileName, Temp);
 end;
 Seek(FileName, FileSize(FileName) - 2);
 Truncate(FileName);
 Close(FileName);
end;

Procedure DeleteFromBeginOfFile(var FileName : TFile);
begin
 DeleteFromFile(FileName, 1);
end;

Procedure DeleteFromFileByPos(n : integer; var FileName : TFile; pos : integer);
var
 i : integer;
begin
 for i := 1 to n do DeleteFromFile(FileName, pos);
end;

Procedure ShowCountryInfo(OneMoreCountry : TCountry);
var
 phrase : string[7];
begin
 with OneMoreCountry do
 begin
  WriteLn('Name of country: ', Name);
  WriteLn('The capital of ', Name, ' is ', Capital);
  WriteLn('Funds: ', Funds, '$'); WriteLn('Popultaion: about ', People, ' people');
  if Independent = true then phrase := '' else phrase := 'not ';
  WriteLn(Name, ' is ', phrase, 'independent');
  if InWar = true then phrase := '' else phrase := 'not ';
  WriteLn(Name, ' is ', phrase, 'in war');
 end;
end;

Procedure LoadFromFileToScreen(var FileName : TFile; pos : integer);
var
 i : integer;
 OneMoreCountry : TCountry;
begin
 Reset(FileName);
 for i := pos+1 to FileSize(FileName)-1  do  //pos+1
 begin
  Seek(FileName, i);
  Read(FileName, OneMoreCountry);
  ShowCountryInfo(OneMoreCountry);
 end;
 Close(FileName);
end;

BEGIN
 ClrScr;
 assign(MyFile, 'countries.txt');
 Write('How many countries: ');
 ReadLn(n);
 AddToFile(n, MyFile);
 WriteLn('Succesfully added');
 WriteLn;
 LoadFromFileToScreen(MyFile, 0);
 ReadLn;
 Write('How many countries to end of file: ');
 ReadLn(n);
 AddToEndOfFile(n, MyFile);
 LoadFromFileToScreen(MyFile, 0);
 ReadLn;
 Write('How many files to delete: ');
 ReadLn(n);
 Write('Choose position: '); ReadLn(pos);
 DeleteFromFileByPos(n, MyFile, pos);
 LoadFromFileToScreen(MyFile, 0);
 WriteLn('And now I am going to delete one record from the beginning of file');
 DeleteFromBeginOfFile(MyFile);
 LoadFromFileToScreen(MyFile, 0);
 ReadLn
END.
На картинке ниже видно, что до удаления все работает. Дальше - другой вопрос, свои подозрения оставил в комментариях.
Изображения
Тип файла: jpg qwe.JPG (60.4 Кб, 24 просмотров)
Все тривиальное просто

Последний раз редактировалось whatever; 28.01.2012 в 01:00.
whatever вне форума Ответить с цитированием
Старый 28.01.2012, 00:45   #5
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Если кому интересно, в дэлфи это можно проделать вот так:
Код:
Program Project12;
{$APPTYPE CONSOLE}
uses
  sysutils;

TYPE
 Money = 1..1000000;
// Tcountry=record;
 TCountry =
  record
   Name : string[30];
   Capital : string[20];
   Funds, people : money;
   Independent, InWar : boolean;
   procedure GetCountryInfo;
   procedure AddToEndOfFile(n : integer; path:string);
   Procedure LoadFromFileToScreen(var path:string; pos : integer);
   Procedure ShowCountryInfo;
  end;
  TFile = file of TCountry;



VAR
 MyFile : TFile;
 n, pos : integer;
 a:Tcountry;
 path:string;

Procedure Tcountry.GetCountryInfo;
var
 yn : char;
begin
// with MyCountry do
 begin
  Write('Enter name of country: '); ReadLn(Name);
  Write('Enter capital of ', Name, ': '); ReadLn(Capital);
  Write('People, funds: '); ReadLn(People, Funds);
  Write('Is ', Name,  ' independent? (y/n) '); ReadLn(yn); if yn = 'y' then Independent := true else Independent := false;
  Write('Is ', Name,  ' in war? (y/n) '); ReadLn(yn); if yn = 'y' then InWar := true else InWar := false;
 end;
end;
                                     {
Procedure AddToFile(n : integer; var FileName : TFile);
var
 i, pos : integer;
 OneMoreCountry : TCountry;
begin
 ReWrite(FileName);
 for i := 1 to n do
 begin
  GetCountryInfo(OneMoreCountry); Write('Input position: '); ReadLn(Pos);
  Seek(FileName, pos);
  Write(FileName, OneMoreCountry);
 end;
 Close(FileName);
end;            }

Procedure Tcountry.AddToEndOfFile;
var
 i : integer;
// OneMoreCountry : TCountry;
 filename:file of Tcountry;
begin
 for i := 1 to n do
 begin
  assign(filename,path);
  rewrite(FileName);
  GetCountryInfo;//(OneMoreCountry);
//  Seek(FileName, FileSize(FileName));
  Write(FileName, self);
 end;
 Close(FileName);
end;             {

Procedure AddToEndOfFile1(var FileName : TFile);
begin
 AddToEndOfFile(1, FileName);
end;

Procedure DeleteFromFile(var FileName : TFile; pos : integer);
var
 i : integer;
 temp : TCountry;
begin
 Reset(FileName);
 for i := pos to FileSize(FileName) - 1 do
 begin
  Seek(FileName, i + 1);
  Read(FileName, Temp);
  Seek(FileName, i);
  Write(FileName, Temp);
 end;
 Seek(FileName, FileSize(FileName) - 2);
 Truncate(FileName);
 Close(FileName);
end;

Procedure DeleteFromBeginOfFile(var FileName : TFile);
begin
 DeleteFromFile(FileName, 1);
end;

Procedure DeleteFromFileByPos(n : integer; var FileName : TFile; pos : integer);
var
 i : integer;
begin
 for i := 1 to n do DeleteFromFile(FileName, pos);
end;
 }
Procedure Tcountry.ShowCountryInfo;
var
 phrase : string[7];
begin
 begin
  WriteLn('Name of country: ', Name);
  WriteLn('The capital of ', Name, ' is ', Capital);
  WriteLn('Funds: ', Funds, '$'); WriteLn('Popultaion: about ', People, ' people');
  if Independent = true then phrase := '' else phrase := 'not ';
  WriteLn(Name, ' is ', phrase, 'independent');
  if InWar = true then phrase := '' else phrase := 'not ';
  WriteLn(Name, ' is ', phrase, 'in war');
 end;
end;

Procedure Tcountry.LoadFromFileToScreen(var path: string; pos: Integer);
var
 i : integer;
// OneMoreCountry : TCountry;
  filename:file of Tcountry;
begin
 assignfile(filename,path);
 Reset(FileName);
// for i := pos to FileSize(FileName) - 1 do
// begin
//  Seek(FileName, i);
  Read(FileName, self);
  ShowCountryInfo;
// end;
 Close(FileName);
end;

BEGIN
 //ClrScr;
// assign(MyFile, 'countries.txt');
{ Write('How many countries: ');
 ReadLn(n);
 AddToFile(n, MyFile);
 WriteLn('Succesfully added');
 WriteLn;                        }
// a.GetCountryInfo;
// LoadFromFileToScreen(MyFile, 0);
// ReadLn;
// Write('How many countries to end of file: ');
// ReadLn(n);
 n:=1;
 path:='countries.txt';
 a.AddToEndOfFile(n, path);
{ LoadFromFileToScreen(MyFile, 0);
 ReadLn;}
// Write('How many files to delete: ');
// ReadLn(n);
// Write('Choose position: ');
// ReadLn(pos);
// DeleteFromFileByPos(n, MyFile, pos);
 a.LoadFromFileToScreen(path,n);
// WriteLn('And now I am going to delete one record from the beginning of file');
WriteLn('no, you don''t');
// DeleteFromBeginOfFile(MyFile);
// LoadFromFileToScreen(MyFile, 0);
 ReadLn
END.
До ума не доводил, но идея понятна.
Все тривиальное просто

Последний раз редактировалось whatever; 28.01.2012 в 00:57.
whatever вне форума Ответить с цитированием
Старый 28.01.2012, 11:05   #6
RakNaGore
Пользователь
 
Регистрация: 10.07.2011
Сообщений: 12
Восклицание Окончательный вариант:

Код:
Program AsAlwaysTest;

Uses
 Crt;

TYPE
 Money = 1..1000000;
 TCountry =
  record
   Name : string[30];
   Capital : string[20];
   Funds, people : money;
   Independent, InWar : boolean;
  end;
 TFile = file of TCountry;

VAR
 MyFile : TFile;
 n, pos : integer;

Procedure GetCountryInfo(var MyCountry : TCountry);
var
 yn : char;
begin
 with MyCountry do
 begin
  Write('Enter name of country: '); ReadLn(Name);
  Write('Enter capital of ', Name, ': '); ReadLn(Capital);
  Write('People, funds: '); ReadLn(People, Funds);
  Write('Is ', Name,  ' independent? (y/n) '); ReadLn(yn); if yn = 'y' then Independent := true else Independent := false;
  Write('Is ', Name,  ' in war? (y/n) '); ReadLn(yn); if yn = 'y' then InWar := true else InWar := false;
 end;
end;

Procedure AddToFile(n : integer; var FileName : TFile);
var
 i, pos : integer;
 OneMoreCountry : TCountry;
begin
 ReWrite(FileName);
 for i := 1 to n do
 begin
  GetCountryInfo(OneMoreCountry); Write('Input position: '); ReadLn(Pos); WriteLn;
  Seek(FileName, pos);
  Write(FileName, OneMoreCountry);
 end;
 Close(FileName);
end;

Procedure AddToEndOfFile(n : integer; var FileName : TFile);
var
 i : integer;
 OneMoreCountry : TCountry;
begin
 if n > 0 then
 begin
  for i := 1 to n do
  begin
   Reset(FileName);
   GetCountryInfo(OneMoreCountry);
   Seek(FileName, FileSize(FileName));
   Write(FileName, OneMoreCountry);
  end;
  Close(FileName);
 end; 
end;

Procedure AddToEndOfFile1(var FileName : TFile);
begin
 AddToEndOfFile(1, FileName);
end;

Procedure DeleteFromFile(var FileName : TFile; pos : integer);
var
 i : integer;
 temp : TCountry;
begin
 Reset(FileName);
 for i := pos to FileSize(FileName) - 2 do
 begin
  Seek(FileName, i + 1);
  Read(FileName, Temp);
  Seek(FileName, i);
  Write(FileName, Temp);
 end;
 Truncate(FileName);
 Close(FileName);
end;

Procedure DeleteFromBeginOfFile(var FileName : TFile);
begin
 DeleteFromFile(FileName, 0);
end;

Procedure DeleteFromFileByPos(n : integer; var FileName : TFile; pos : integer);
var
 i : integer;
begin
 for i := 1 to n do DeleteFromFile(FileName, pos);
end;

Procedure ShowCountryInfo(OneMoreCountry : TCountry);
var
 phrase : string[7];
begin
 with OneMoreCountry do
 begin
  WriteLn('Name of country: ', Name);
  WriteLn('The capital of ', Name, ' is ', Capital);
  WriteLn('Funds: ', Funds, '$'); WriteLn('Popultaion: about ', People, ' people');
  if Independent = true then phrase := '' else phrase := 'not ';
  WriteLn(Name, ' is ', phrase, 'independent');
  if InWar = true then phrase := '' else phrase := 'not ';
  WriteLn(Name, ' is ', phrase, 'in war');
 end;
end;

Procedure LoadFromFileToScreen(var FileName : TFile; pos : integer);
var
 i : integer;
 OneMoreCountry : TCountry;
begin
 Reset(FileName);
 for i := pos to FileSize(FileName) - 1 do
 begin
  Seek(FileName, i);
  Read(FileName, OneMoreCountry);
  ShowCountryInfo(OneMoreCountry);
  WriteLn;
 end;
 Close(FileName);
end;

BEGIN
 ClrScr;
 assign(MyFile, 'countries.txt');
 Write('How many countries: '); ReadLn(n);
 AddToFile(n, MyFile); WriteLn('Succesfully added'); WriteLn;
 LoadFromFileToScreen(MyFile, 0); ReadLn;
 Write('How many countries add to the end of file: '); ReadLn(n); WriteLn;
 AddToEndOfFile(n, MyFile); LoadFromFileToScreen(MyFile, 0); ReadLn;
 Write('How many records to delete: '); ReadLn(n);
 Write('Choose position: '); ReadLn(pos); DeleteFromFileByPos(n, MyFile, pos); LoadFromFileToScreen(MyFile, 0); ReadLn;
 WriteLn('And now I am going to delete one record from the beginning of file');
 DeleteFromBeginOfFile(MyFile); LoadFromFileToScreen(MyFile, 0);
 ReadLn; ReadLn
END.
RakNaGore вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами (Pascal) andrey256 Помощь студентам 5 25.10.2011 20:52
Работа с типизироваными файлами Form_13 Паскаль, Turbo Pascal, PascalABC.NET 2 05.10.2011 15:59
Работа с файлами(Pascal Mekkeliard Помощь студентам 2 07.12.2010 15:56
Pascal/ работа с файлами V@dlo Помощь студентам 1 14.11.2009 19:55