Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Запись и чтение из файла.


Автор: Neolamer 4.2.2007, 17:40
Когда я пытаюсь записать данные, путём интерактивного ввода из программы в файл, в файле получается тарабарский язык и из-за этого они следовательно не могут быть использованы прогой или выведены на экран в чом трабл?Мне надо срочно прогу написать а как я проверю её работоспособность??

Автор: Strannik 4.2.2007, 18:11
Как ты в файл выводишь? Код напиши.

Автор: skyboy 4.2.2007, 18:18
Neolamer, ты писал в файл программой, скомпиленной Turbo Pascal'ем или Borland Pascal'ем, что почти одно и то же? А смотреть пытаешься виндовым блокнотом? тогда ничего удивительного нет - это несоответствие кодировок: паскаль-программа сохраняет  текст в cp866, а блокнот отображает по умолчанию - в ср1251. Если надо в блокноте читать текст в dos-кодировке выбери соответствующий шрифт(Формат-Шрифт - выбрать любой шрифт без символов "О" или "Тт" слева: Terminal, System или другие). Если же проблема не в отображении - и в самом деле, не помешало бы привести код и поподробнее описать  условия возникновения бага...

Автор: Neolamer 4.2.2007, 18:31
Код

uses crt;
type
recfile=record (*Zapis dannih po sborshikam*)
fam:string[15];
d1,d2,d3,d4,d5,d6:word;
end;
var
i:integer; (*Nomer zapisi*)
buf:recfile;
f:file of recfile;
begin
clrscr;
assign(f,'sbor.txt');
rewrite(f);
writeln('Vvedite dannie po sborshikam:');
for i:=1 to 5 do
begin
write('Familia-> '); readln(buf.fam);
write('Chislo isdelii sobranih v ponedelnik-> '); readln(buf.d1);
write('Chislo isdelii sobranih vo vtornik  -> '); readln(buf.d2);
write('Chislo isdelii sobranih v sredu     -> '); readln(buf.d3);
write('Chislo isdelii sobranih v chetverg  -> '); readln(buf.d4);
write('Chislo isdelii sobranih v piatnicu  -> '); readln(buf.d5);
write('Chislo isdelii sobranih v subbotu   -> '); readln(buf.d6);
write(f,buf);
end;
close(f);
readkey;
end.

Я ввожу данные в файл, а они не выводятся на экран. В чом трабл?

Автор: Winprogrammer 4.2.2007, 19:17
Neolamer, млин!!!! Нельзя было сделать по-человечески(вывести код со структуризацией)?!

Добавлено @ 19:24 
Паскаль не понимает так: write(f,buf);, т.к. buf - это запись. Нужно просто выводитькаждый элемент этого класса по-отдельности. Та же проблема и с файлом. Туда записывается запись, а нужно писать элемент записи.

Автор: volvo877 4.2.2007, 19:32
Цитата(Winprogrammer @  4.2.2007,  18:17 Найти цитируемый пост)
Паскаль не понимает так: write(f,buf);, т.к. buf - это запись. 
Правда? А то, что это файл записей, а не текстовый, тебе ни о чем не говорит?

Neolamer, вот тебе и ответ твой на вопрос... Ты записываешь машинное представление данных, а прочитать хочешь текстовое? Так не бывает... Как пишешь, так и прочтешь. Так что, придется описать файл как текстовый, и записывать в него данные...

Автор: Neolamer 4.2.2007, 19:34
Цитата(Winprogrammer @ 4.2.2007,  19:17)
Neolamer, млин!!!! Нельзя было сделать по-человечески(вывести код со структуризацией)?!

Добавлено @ 19:24 
Паскаль не понимает так: write(f,buf);, т.к. buf - это запись. Нужно просто выводитькаждый элемент этого класса по-отдельности. Та же проблема и с файлом. Туда записывается запись, а нужно писать элемент записи.

сп, буду дальше думать теперь проблема в том чтоб выводить все записи по сборщикам, а то выводится запись последнего сборщика

Автор: Winprogrammer 4.2.2007, 19:37
Цитата(Neolamer @  4.2.2007,  19:34 Найти цитируемый пост)
все записи по сборщикам, а то выводится запись последнего сборщика 

?????????????

Добавлено @ 19:40 
Тебе нужен текстовый файли или можно и можно типизированный?

Автор: Neolamer 4.2.2007, 19:52
Цитата(Winprogrammer @ 4.2.2007,  19:37)
Цитата(Neolamer @  4.2.2007,  19:34 Найти цитируемый пост)
все записи по сборщикам, а то выводится запись последнего сборщика 

?????????????

Добавлено @ 19:40 
Тебе нужен текстовый файли или можно и можно типизированный?

Да любой мне нужно просто до завтра прогу успеть написат вот эту прогу.
Создать файл содержащий сведения о количестве изделий, собранных сборщиками цеха за неделю. Каждая запись содержит поля: фамилия сборщика, количество изделий собранных им ежедневно в течение шестидневной недели, т.е. раздельно понеделник, вторник и т.д.
   б)Написать прогу с использованием процедур, выводящую следующую информацию: фамилию сборщика и общее количество деталий, собранное им за неделю, фамилию сборщика собравшего наибольшего наибольшее число деталий и день, когда он достиг наивысшей производительности труда. 
Иначе мне каюк мне её завтра в 11 надо будет защищать на комисии, не защищу вылечу нафиг из бга smile 

Автор: Winprogrammer 4.2.2007, 19:55
я знаю как решить. наверно... через 5-10 минут выложу решение

Автор: Neolamer 4.2.2007, 19:56
Цитата(Winprogrammer @ 4.2.2007,  19:55)
я знаю как решить. наверно... через 5-10 минут выложу решение

буду примного благодарен smile 

Автор: Winprogrammer 4.2.2007, 20:05
Те надо на Turbo Pascal? или на Borland Pascal сойдет?

Автор: Neolamer 4.2.2007, 20:07
Цитата(Winprogrammer @ 4.2.2007,  20:05)
Те надо на Turbo Pascal? или на Borland Pascal сойдет?

на turbo pascal7

Автор: Winprogrammer 4.2.2007, 20:10
хм. ща пошлю код на Borland Pascal, а там сам переделаешь

Автор: Neolamer 4.2.2007, 20:11
Цитата(Winprogrammer @ 4.2.2007,  20:10)
хм. ща пошлю код на Borland Pascal, а там сам переделаешь

А в чом разница этих языков?

Автор: Winprogrammer 4.2.2007, 20:17
лови

Автор: Neolamer 4.2.2007, 20:22
Цитата(Winprogrammer @ 4.2.2007,  20:17)
лови

сп, щас посмотрим.

Автор: Neolamer 4.2.2007, 20:39
 smile не пашет вывод на экран после того как все введёшь я тоже самое писал

Автор: Winprogrammer 4.2.2007, 20:45
А на экран я и не делал.

вот добавь после вызова процедуры экспорта в файл:
Код

 writeln(buf.fam);
 writeln(buf.d1);
 writeln(buf.d2);
 writeln(buf.d3);
 writeln(buf.d4);
 writeln(buf.d5);
 writeln(buf.d6);

Автор: Neolamer 4.2.2007, 20:52
Цитата(Winprogrammer @ 4.2.2007,  20:45)
А на экран я и не делал.

вот добавь после вызова процедуры экспорта в файл:
Код

 writeln(buf.fam);
 writeln(buf.d1);
 writeln(buf.d2);
 writeln(buf.d3);
 writeln(buf.d4);
 writeln(buf.d5);
 writeln(buf.d6);

Тогда инфа выводиться после каждого ввода сборщика, а я хочу чтоб она вывелась после всех вводов инфы, и чтоб она была по всем сборщикам хотя лучше бы ты мне объяснил чо делат по моим заданиям, как вывести фамилию сборщика и общее количество сделанных им деталий?

Автор: Winprogrammer 4.2.2007, 20:56
Заводишь массив нужной длины типа recfile и после ввода всей инфы бежишь но этому массиву и выводишь

Автор: Neolamer 4.2.2007, 21:01
smile Думаешь я смогу это сделать?

Добавлено @ 21:03 
Чтобы найти обще количество изделий сделаных каждым сборщиком нужно тоже масив заводить?

Автор: Winprogrammer 4.2.2007, 21:15
Цитата(Neolamer @  4.2.2007,  21:01 Найти цитируемый пост)
Думаешь я смогу это сделать?

Поверь в свои силы!!!!!!!!!

Цитата(Neolamer @  4.2.2007,  21:01 Найти цитируемый пост)
Чтобы найти обще количество изделий сделаных каждым сборщиком нужно тоже масив заводить? 

Зачем?! у тя уже есть массив для каждого сборщика. Бежишь по всему массиву и для каждого сборщика путем сумирования этих св-в находишь для каждого сумму всех изделий
Код

 buf.d1+buf.d2+buf.d3+buf.d4+ buf.d5+buf.d6;

Автор: Neolamer 4.2.2007, 21:20
Цитата(Winprogrammer @ 4.2.2007,  21:15)
Зачем?! у тя уже есть массив для каждого сборщика. Бежишь по всему массиву и для каждого сборщика путем сумирования этих св-в находишь для каждого сумму всех изделий

я это и имел ввиду что типа его тоже использовать для этой цели

Автор: Winprogrammer 4.2.2007, 21:25
Цитата(Neolamer @  4.2.2007,  21:20 Найти цитируемый пост)
я это и имел ввиду что типа его тоже использовать для этой цели 

есессно! а для чего он тогда нужен?

Автор: Neolamer 4.2.2007, 21:28
Так это я сделал smile , теперь както надо найти фамилию сборщика собравшего наибольшее число изделий.
Код

uses crt;
type recfile=record (*Zapis dannih po sborshikam*)
fam:string[15];
d1,d2,d3,d4,d5,d6:word;
end;
var
i:integer; (*Nomer zapisi*)
f:Text;
m:array[1..7] of recfile;
procedure ExportToFile;
begin
writeln(f, m[i].fam);
writeln(f, m[i].d1);
writeln(f, m[i].d2);
writeln(f, m[i].d3);
writeln(f, m[i].d4);
writeln(f, m[i].d5);
writeln(f, m[i].d6);
end;
begin
clrscr;
assign(f,'sbor.txt');
rewrite(f);
writeln('Vvedite dannie po sborshikam:');
for i:=1 to 2 do
begin
write('Familia-> '); readln(m[i].fam);
write('Chislo isdelii sobranih v ponedelnik-> '); readln(m[i].d1);
write('Chislo isdelii sobranih vo vtornik  -> '); readln(m[i].d2);
write('Chislo isdelii sobranih v sredu     -> '); readln(m[i].d3);
write('Chislo isdelii sobranih v chetverg  -> '); readln(m[i].d4);
write('Chislo isdelii sobranih v piatnicu  -> '); readln(m[i].d5);
write('Chislo isdelii sobranih v subbotu   -> '); readln(m[i].d6);
ExportToFile;

end;
for i:=1 to 2 do
writeln(i,': ',m[i].fam,'-> ',m[i].d1+m[i].d2+m[i].d3+m[i].d4+m[i].d5+m[i].d6);
close(f);
readkey;
end.

Автор: Winprogrammer 4.2.2007, 22:35
При подсчете кол-ва элементов просто в некую переменную записываешь и сравниваешь если у пред. больше тогда не изменяешь знач. этой переменной иначе изменяешь.

Автор: Neolamer 4.2.2007, 23:49
Цитата(Winprogrammer @ 4.2.2007,  22:35)
При подсчете кол-ва элементов просто в некую переменную записываешь и сравниваешь если у пред. больше тогда не изменяешь знач. этой переменной иначе изменяешь.

так я элементы считаю во writeln, т.к. если я отдельно считаю, что не получаеется подсчот по каждому сборщику а только по паследнему так как я смогу присвоить перменную этой сумме?

Добавлено @ 23:58 
Короче допеши пж эту прогу, у меня уже бошка гудит ничо несоображаю целый день за ней сижу, завтра её сдавать надо я нефига не соображаю smile  smile  smile я бешусь уже smile  smile 

Автор: Strannik 5.2.2007, 00:02
Кстати, а не лучше ли было хранить кол-во деталей по дням в массиве? А то так некрасиво выходит.

Код

fmax:='';
max:=0;
for i:=1 to n do
 begin
  t:=m[i].d1+m[i].d2+m[i].d3+m[i].d4+m[i].d5+m[i].d6;
  if t>max then
   begin
    max:=t;
    fmax:=m[i].fam;
   end;
 end;

Автор: Neolamer 5.2.2007, 00:07
Цитата(Strannik @ 5.2.2007,  00:02)
Кстати, а не лучше ли было хранить кол-во деталей по дням в массиве? А то так некрасиво выходит.

Код

fmax:='';
max:=0;
for i:=1 to n do
 begin
  t:=m[i].d1+m[i].d2+m[i].d3+m[i].d4+m[i].d5+m[i].d6;
  if t>max then
   begin
    max:=t;
    fmax:=m[i].fam;
   end;
 end;

Огромное сп, теперь мне нужной найти день когда этот чел больше всего собрал деталей.

Автор: Strannik 5.2.2007, 00:25
Код

fmax:='';
day:=0;
max:=0;
for i:=1 to n do
 begin
  t:=m[i].d1+m[i].d2+m[i].d3+m[i].d4+m[i].d5+m[i].d6;
  if t>max then
   begin
    max:=t;
    fmax:=m[i].fam;
    day:=i;
   end;
 end;

Это вместо того что я писал раньше, ишет и фамилию и день...

Всё... я - спать,  дальше пусть кто-нибудь другой.

Автор: Neolamer 5.2.2007, 00:34
Цитата(Strannik @ 5.2.2007,  00:25)
Код

fmax:='';
day:=0;
max:=0;
for i:=1 to n do
 begin
  t:=m[i].d1+m[i].d2+m[i].d3+m[i].d4+m[i].d5+m[i].d6;
  if t>max then
   begin
    max:=t;
    fmax:=m[i].fam;
    day:=i;
   end;
 end;

Это вместо того что я писал раньше, ишет и фамилию и день...

Всё... я - спать,  дальше пусть кто-нибудь другой.

Так мне больши и ничо не надо огромное сп smile

Добавлено @ 00:44 
Цитата(Strannik @ 5.2.2007,  00:25)
Код

fmax:='';
day:=0;
max:=0;
for i:=1 to n do
 begin
  t:=m[i].d1+m[i].d2+m[i].d3+m[i].d4+m[i].d5+m[i].d6;
  if t>max then
   begin
    max:=t;
    fmax:=m[i].fam;
    day:=i;
   end;
 end;

Это вместо того что я писал раньше, ишет и фамилию и день...

Всё... я - спать,  дальше пусть кто-нибудь другой.

Что-то день неверно считается кто исправит? smile 

Автор: Neolamer 5.2.2007, 18:34
Всем сп, получил зачот. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)