Второй день сижу вот над чем... Как заставить прогу считать содержимое файла (явно текстового, ибо разбит на строки разной длины) и каждый символ повторить 2 раза через пробел? Вот содержимое: 1 3 5 6 7 8 2 3 3 3 3 4 6 4 4 5 1 1 1 1 6 5 7 5 2
И что делать, если программа при исполнении выдаёт мне "файл не открыт для чтения", при том, что у меня указано, что он открыт?
volvo
1.02.2006 20:32
Приведи свой неработающий код...
Насчет "как это сделать" - придется завести второй файл, и читая из первого, заносить число дважды во второй... Правильно будет делать это, используя функцию seekeoln (посмотри в поиске, я где-то приводил пример чтения с ее помощью из файла)
TBVlad
1.02.2006 20:59
Вот код. В общем, он компилируется и работает. НО... он перезаписывает данные во второй файл (увы, я не понимаю пока, как сделать так, чтобы он перезаписывал в старый), и не посимвольно, а дублируя группу символов (строку). Если я ухожу от текстового типа и задаю в типе файла и в переменной элементов другие (integer, char), компилятор ругается и говорит, что файл не открыт...
Program File1; Var t,t1 :text; s :string;
Begin Assign(t,'file1.txt'); Assign(t1,'file2.txt'); {$I-} Reset(t); {$I+} If IOResult<>0 then Begin Writeln('The file is absent.'); Halt; End; Rewrite(t1); While not eoln(t) do Begin Read(t,s); Writeln(t1, s,s,' '); Readln(t); End; Close(t1); End.
klem4
1.02.2006 22:07
Может быть тебе вот такой результат нужен :
uses crt; var f1,f2 : text; s,temp : string; i : byte;
begin
clrscr;
assign(f1,'c:\input.txt');
assign(f2,'c:\output.txt');
reset(f1); rewrite(f2);
while not(eof(f1)) do begin readln(f1,s); i := 1; while(i <= length(s)) do begin temp := s[i] + ' '; insert(temp,s,i); inc(i,4); end; writeln(f2,s); end;
reset(f2); rewrite(f1);
while(not(eof(f2))) do begin readln(f2,s); writeln(f1,s); end;
close(f1); close(f2);
readln; end.
Цитата
in 0 1 2 1 2 3
out : (будет и в файле in и в файле out) 0 0 1 1 2 2 1 1 2 2 3 3
volvo
1.02.2006 22:07
Цитата(TBVlad @ 1.02.2006 15:59)
он перезаписывает данные во второй файл (увы, я не понимаю пока, как сделать так, чтобы он перезаписывал в старый)
Никак... Текстовый файл не имеет Random-доступа, только последовательно, значит ты не можешь ЗАМЕНИТЬ старую информацию на новую... Когда второй файл будет полностью создан - удали первый и переименуй новый на старое имя...
Program File1; Var t, t1: text; n: integer;
const s_name = 'fff.txt';
begin Assign(t, s_name); {$I-} reset(t); {$I+} if IOResult <> 0 then begin Writeln('The file is absent.'); Halt; end;
Assign(t1,'fff_1.txt'); Rewrite(t1); while not eof(t) do begin
While not eoln(t) do Begin Read(t,n); Write(t1, n, ' ', n,' '); end; Readln(t); writeln(t1); end;
close(t); Close(t1);
erase(t); rename(t1, s_name); End.
TBVlad
1.02.2006 23:08
Спасибо огромное. Оба варианта работают... быстродействие в данном случае мало страдает, да и не важно пока.
Volvo, а последовательная замена элементов в текстовом файле тоже невозможна? Или возможна путём скачивания данных в массив и поэлементного приравнивания элементов файла к массиву?
volvo
1.02.2006 23:14
Замена вообще возможна только через полное удаление старой информации (ReWrite), и занесение новой. Откуда ты будешь заносить новую информацию (из другого ли файла, из массива, или просто генерировать "на лету") - никакой разницы...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.