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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2012, 21:35   #1
pashka_dos
Пользователь
 
Аватар для pashka_dos
 
Регистрация: 19.11.2011
Сообщений: 83
Сообщение Ошибка записи на диск.

Код:
program milioner;
uses crt;
type q = record
     id: integer;
     title: string[50];
     answ: array [1..4] of string[30];
     t_answ: string[30];
     lev: integer;
     cat: integer;
     end;
var f,f1: file of q;
    a,b: q;
    i,j,k,n,r: integer;
    switch: boolean;
begin
randomize; clrscr;
assign(f,'q.dat');
assign(f1,'q1.dat');

reset(f);

i:=1;
while i <= 5 do begin
    switch:=true;
    reset(f);
    k:=random(filesize(f));
    seek(f,k);
    read(f,a);
    if a.lev = 1 then begin

       reset(f1);
       seek(f1,0);

       while not eof(f1) do begin
             read(f1,b);
             if a.id = b.id then switch:=false;
       end;

       if switch then begin
          writeln(a.title);

          seek(f1,filesize(f1));
          write(f1,a);      ЗДЕСЬ ОШИБКА!               

          inc(i);
       end;

       close(f1);
    end;
    close(f);
end;

close(f);
readln;
END.
pashka_dos вне форума Ответить с цитированием
Старый 18.04.2012, 22:48   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, задания как такого я не вижу.

во-вторых, если не считать безумного алгоритма (он легко уходит в бесконечных цикл!) код вполне себе рабочий.
вот только последний close(f) перед readln уберите - он ошибочен и не нужен.

в-третьих, я бы пересоздал файлы q.dat и q1.dat. думаю ошибка в том, что файлы были созданы, а потом тип-запись q изменился. Это и приводит к ошибке чтения/записи!


p.s. проверьте размеры файлов g.dat и q1.dat
если в коде написать так:
WriteLn('size record q = ', sizeof(q));
то легко увидеть, что
size record q = 212
поэтому размеры файлов должны быть СТРОГО кратны 212. Если это не так - можете смело удалять файл - его структура не соответствует типу q

Последний раз редактировалось Serge_Bliznykov; 18.04.2012 в 22:52.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2012, 23:53   #3
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Не знаю как в pascal, но в Delphi кратен должен быть 220. В файл записываются ещё и идентификаторы полей и разделители всякие записываются.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 18.04.2012, 23:58   #4
pashka_dos
Пользователь
 
Аватар для pashka_dos
 
Регистрация: 19.11.2011
Сообщений: 83
Сообщение

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, задания как такого я не вижу.

во-вторых, если не считать безумного алгоритма (он легко уходит в бесконечных цикл!) код вполне себе рабочий.
вот только последний close(f) перед readln уберите - он ошибочен и не нужен.

в-третьих, я бы пересоздал файлы q.dat и q1.dat. думаю ошибка в том, что файлы были созданы, а потом тип-запись q изменился. Это и приводит к ошибке чтения/записи!


p.s. проверьте размеры файлов g.dat и q1.dat
если в коде написать так:
WriteLn('size record q = ', sizeof(q));
то легко увидеть, что
size record q = 212
поэтому размеры файлов должны быть СТРОГО кратны 212. Если это не так - можете смело удалять файл - его структура не соответствует типу q
Насчет задания: нужно написать программу типа игры "Кто хочет стать миллионером?" написал одну программу для ввода вопросов в файл f. Теперь хочу сделать в основной программе вывод случайным образом пяти вопросов первого уровня сложности (if a.lev=1...). Потом записать эти вопросы в файл f1 (делаю это для того чтобы не выводить вопросы которые уже вывелись, эта проверка делается во втором цикле while)
Если на Ваше мнение алгоритм немножко туповат, подскажите, пожалуйста, другой.

Цикл не бесконечный!
Если в вопрос который был отобран по id еще не вывелся (проверка делается во втором цикле while) тогда он выводится, записывается в файл f1 и тогда - inc(i).

Код:
 if switch then begin
          writeln(a.title);

          seek(f1,filesize(f1));
          write(f1,a);              

          inc(i);
       end;


close(f) убрал - спасибо.
Файлы заново пересоздал - ничего не помогло.
pashka_dos вне форума Ответить с цитированием
Старый 19.04.2012, 17:01   #5
pashka_dos
Пользователь
 
Аватар для pashka_dos
 
Регистрация: 19.11.2011
Сообщений: 83
Печаль

ребята ну помогите кто как может
pashka_dos вне форума Ответить с цитированием
Старый 19.04.2012, 19:36   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Ты еще не написал, что сделал в ответ на полученные советы.
s-andriano вне форума Ответить с цитированием
Старый 19.04.2012, 19:45   #7
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Pasha_dos, залей файл q , чтобы можно было поэкспериментировать.
Так же не пойму зачем два раза пытаетесь открыть файл "q".
Код:
.........................
reset(f);

i:=1;
while i <= 5 do begin
    switch:=true;
    reset(f);
................
Но проблема кажется не в этом.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 19.04.2012 в 20:02.
Rin вне форума Ответить с цитированием
Старый 20.04.2012, 10:51   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Файлы заново пересоздал - ничего не помогло.
с моими файлами q.dat и q1.dat ваш код работает.

чем вам помочь - я не знаю.


Цитата:
Сообщение от Rin
Не знаю как в pascal, но в Delphi кратен должен быть 220. В файл записываются ещё и идентификаторы полей и разделители всякие записываются.
причина не в этом. причина в том, что Integer в Delphi 32-х битный (занимает ровно 4-байта), а в TurboPascal - 2 байта.
в записи три Integer (это даёт разницу в 6 байт, ну и плюс выравнивание (его можно отключить использовать конструкцию packed record)
попробуйте в Delphi посмотреть размер такого типа, например:
Код:
type q =  record
     id: word;
     title: string[50];
     answ: array [1..4] of string[30];
     t_answ: string[30];
     lev: word;
     cat: word;
     end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Локальный диск D защищен от записи. Что делать? MatriXX Безопасность, Шифрование 5 31.12.2011 14:46
Измерить скорость чтения и записи данных на диск testerka Общие вопросы .NET 2 18.11.2010 10:48
узнать программно скорость записи на диск smalsvoloch Общие вопросы Delphi 0 29.04.2010 10:33
Определить возможность записи на диск [HDD,USB FLash,other] Lime Общие вопросы Delphi 5 28.11.2009 19:53