4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
1

Переписать один файл в другой, чтобы были удалены лишние пробелы и каждая строка содержала ровно 20 символов

10.12.2016, 00:51. Показов 1390. Ответов 16
Метки нет (Все метки)

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

Помогите пожалуйста, срочно надо сдать лабу, а времени слишком мало.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2016, 00:51
Ответы с готовыми решениями:

Добавить равномерные пробелы, чтобы строка содержала ровно N символов
Никак не могу сделать так, чтобы слова распределялись примерно равномерно по строке Текст...

Переформатировать файл так, чтобы каждая его строка содержала 30 символов
Создать текстовый файл с произвольным содержимым. Переформатировать файл так, чтобы каждая его...

В файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов
В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов...

В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов
В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов...

16
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
15.12.2016, 22:04  [ТС] 2
Дан текстовый файл f. Переписать его содержимое в файл g таким образом, чтобы в нем были удалены лишние пробелы и каждая строка содержала ровно 20 символов.
Пока выходит только это :
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
program lab9(input,output);
var b1, b2 : string;
    f1name,f2name: string;
    f1,f2: Text;
    i, l, n: integer;
procedure errorFile(f1name:string);
var k: integer;
begin
k:=IOResult;
 if k <> 0 then begin
  writeln ('ошибка #',k,'проверьте искомый файл ', f1name);
  readln;
  halt (8);
 end;
end;
begin
clrscr; 
 writeln('Введите путь к текстовому файлу');
  readln(f1name);
 writeln('Куда загружать результат?');
  readln(f2name);
   assign (f1,f1name);
   assign (f2,f2name);
     {$I-}
     reset(f1);
     errorFile(f1name);
     rewrite(f2);
     errorFile(f2name);
     {$I+}
   n:=0;
   while not eof(f1) do begin
    readln(f1, b1);
    inc(n);
    l:=length(b1);
///////////////////////////////////
    if l = 20 then
     b2:=b1
    else
     begin
      b2:=b1;
      b2[0]:=char (ord(20));
     end;
///////////////////////////////////
   end;
   close(f1);
   close(f2);
end.
Но результата нет. И не могу понять как реализовать удаление лишних пробелов.
0
428 / 359 / 129
Регистрация: 09.09.2011
Сообщений: 1,305
16.12.2016, 11:06 3
ну не верно

1. b2[0]:=char (ord(20)); откуда взяли? так оно могло работать в турбо-паскале, но это грязный хак и сейчас так не работает. кроме того этим кодом вы отрезаете остаток строки, но в задании не ясно, требуется ли именно это, или необходим перенос и до-заполнение строк следующими... Перенос по словам, или тупо по символам...
2. не записываете в файл ничего. по идее b2 нужно писать в файл.


я бы делал так - зачитал бы весь файл в стринг-лист/"одну строку" и обрабатывал. Или читал по 1 символу из файла и конечными автоматами обрабатывал.

так же необходимо уточнить на счет файлов - может ли там быть кириллица? если да, то в какой кодировке?
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
17.12.2016, 22:45  [ТС] 4
Kitayets, Главное кол-во символов в строке, только 20, то-есть "порубать" текст на строки в 20 символов. А язык не имеет значения.
0
Модератор
Эксперт по электронике
8291 / 4194 / 1597
Регистрация: 01.02.2015
Сообщений: 13,037
Записей в блоге: 4
17.12.2016, 22:57 5
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
{$mode delphi}
{$APPTYPE CONSOLE}
 
program Tak;
 
uses
  StrUtils, SysUtils, Classes;
 
const
  d = 20;
 
  cFileNameF = 'Tak.pas';
  cFileNameG = 'Result.txt';
 
var
  sL: TStringList;
  f,                 {файл-источник}
  g : TextFile;      {файл-приёмник}
  i : integer;
  s: string;
 
begin
  sL := TStringList.Create;
  sL.Sorted := FALSE;
  sL.Duplicates := dupIgnore;
  try
    sL.LoadFromFile(cFileNameF);
    for i:=0 to sL.Count-1 do
    begin
      s:=sL.Strings[i];
      if Length(s)<d then
        s:=PadRight(s, d)
      else
        SetLength(s, d);
      sL.Strings[i]:=s;
    end;
    sL.SaveToFile(cFileNameG);
  except
    on Exception do WriteLn('Error');
  end;
  sL.Free;
  writeln('Press Enter...');
  readln;
end.
Это, конечно для фиксированных имён файлов. А что такое "лишние пробелы" - они где - в конце строки, в начале строки, между слов (двойные, тройные пробелы)?

Добавлено через 1 минуту
Или и вправду, нужно сохранить весь текст, перераспределив слова в файле по строкам. И сделав распределение слов по строке.
1
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
18.12.2016, 00:54  [ТС] 6
Вот, что написал на данный момент, программа работает, но не совсем корректно, пробелы лишние удаляет (второй подряд пробел считается лишним), но иногда удаляет нужные. И иногда удаляются нужные символы при переносе. Не могу понять с чем это связано.
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
56
57
program lab9(input,output);
uses crt;
 
var b1, b2 : string;
    f1name,f2name: string;
    f1,f2: Text;
    i, l, n: integer;
 
procedure errorFile(put:string);
var k: integer;
begin
k:=IOResult;
 if k <> 0 then begin
  writeln ('ошибка #',k,' проверьте искомый файл ', put);
  readln;
  halt (8);
 end;
end;
 
begin
clrscr;
 writeln('Введите путь к текстовому файлу');
  readln(f1name);
 writeln('Куда загружать результат?');
  readln(f2name);
   assign (f1,f1name);
   assign (f2,f2name);
     {$I-}
     reset(f1);
     errorFile(f1name);
     rewrite(f2);
     errorFile(f2name);
     {$I+}
   n:=0;
   while not eof(f1) do begin
    readln(f1, b1);
    inc(n);
    l:=length(b1);
///////////////////////////////////
    While (Pos('  ',b1) <> 0) do begin
     Delete(b1, Pos(' ',b1), 1);
    End;
     if l < 20 then
      b2:=b1
     else
      begin
       b2:=b1;
       b2[0]:=char(ord(20));
      end;
///////////////////////////////////
   writeln(f2, b2);
   writeln(length(b2), '<',b2,'>');
   end;
   close(f1);
   close(f2);
   readln;
end.
0
Модератор
Эксперт по электронике
8291 / 4194 / 1597
Регистрация: 01.02.2015
Сообщений: 13,037
Записей в блоге: 4
18.12.2016, 01:11 7
Строки во FreePascal имеют внутренний формат, отличающийся от формата в TurboPascal. С ними нельзя работать так, как показано в строке 48. Эта операция делается SetLength(b2, 20);
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
18.12.2016, 01:20  [ТС] 8
ошибка логического характера? просто у меня всё компилируется, но изначально был вариант сделать это через цикл
Pascal
1
2
b2:='';
for i:=1 to 20 b2:=+b1[i];
Добавлено через 3 минуты
Изменил, по вашему совету, но результат совсем не изменился
0
Модератор
Эксперт по электронике
8291 / 4194 / 1597
Регистрация: 01.02.2015
Сообщений: 13,037
Записей в блоге: 4
18.12.2016, 01:27 9
Там много чего.
1. В строке 38 определяется l:=length(b1), в строках 40-42 модифицируется b1, в 43 на основе устаревшей l принимается решение.
2. строка 48 должна быть SetLength(b2, 20);

Добавлено через 4 минуты
И вы бы уточнили задачу. Вдруг вам нужно из
Код
Строка из нескольких слов для демонстрации
подхода     к решению
задачи.
Получить
Код
Строка из нескольких
слов для демонстраци
и подхода к решению
задачи.
1
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
18.12.2016, 01:30  [ТС] 10
исправил. всё по старому

Добавлено через 1 минуту
Если, решать задачу путем переноса слов, нужно их будет отделить от текста, а в рамках моей лабораторки это слишком сложно, так, что я думаю у меня попроще условие.
0
Модератор
Эксперт по электронике
8291 / 4194 / 1597
Регистрация: 01.02.2015
Сообщений: 13,037
Записей в блоге: 4
18.12.2016, 01:33 11
Тогда приводите тестовые наборы. Что даёте, что получаете, что ожидаете.
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
18.12.2016, 01:45  [ТС] 12
Из:
Строка из нескольких слов для демонстрации
подхода к решению
задачи.
Получить:
Строка из нескольких
слов для демонстраци
и подхода к решению
задачи.
Получаю:
Строка из нескольких
подхода к решению
задачи.

Добавлено через 9 минут
Из:
Строка из нескольких слов для демонстрации
подхода к решению
задачи.

Получить:
Строка из нескольких
слов для демонстраци
и подхода к решению
задачи.

Получаю:
Строка из нескольких
подхода к решению
задачи.
0
Модератор
Эксперт по электронике
8291 / 4194 / 1597
Регистрация: 01.02.2015
Сообщений: 13,037
Записей в блоге: 4
18.12.2016, 01:47 13
Т.е. нужно выполнять перенос слов, а не усекать строки.

Добавлено через 52 секунды
Тэг CODE под кнопкой '#'
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
18.12.2016, 02:10  [ТС] 14
Тест немного неудачный)
Из:
ActionScript 3
1
Длинное предложение с лишними        пробелами, которое    хотим   изменить.
Получить:
ActionScript 3
1
2
3
4
Длинное предложение 
с лишними пробелами,
 которое хотим измен
ить.
Получаю:
ActionScript 3
1
Длинноепредложениесл
Вау, на этом примере программа еще хуже работает

Добавлено через 5 минут
Блин, теперь я понял чего вы от меня добиваетесь, будет ли перенос, либо же просто из строки будет удаляться лишние символы. Извиняюсь за дикий тупняк.
Ладно, со строками, пускай просто лишнее удалиться, не буду заморачиваться.
Не могу понять, что не так с пробелами?
Она то не удаляет когда 1 в исходном варианте текста, то удаляет

Добавлено через 11 минут
Нашел очень глупую ошибку, потерял 1 пробел в этой строке
Pascal
1
     Delete(b1, Pos(' ',b1), 1);
Спасибо большое за помощь!
Теперь понял какие ошибки допустил, постараюсь в будущем так не ошибаться)
Вот код программы, может пригодиться кому
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
56
57
program lab9(input,output);
uses crt;
 
var b1, b2 : string;
    f1name,f2name: string;
    f1,f2: Text;
    i, l, n: integer;
 
procedure errorFile(put:string);
var k: integer;
begin
k:=IOResult;
 if k <> 0 then begin
  writeln ('ошибка #',k,' проверьте искомый файл ', put);
  readln;
  halt (8);
 end;
end;
 
begin
clrscr;
 writeln('Введите путь к текстовому файлу');
  readln(f1name);
 writeln('Куда загружать результат?');
  readln(f2name);
   assign (f1,f1name);
   assign (f2,f2name);
     {$I-}
     reset(f1);
     errorFile(f1name);
     rewrite(f2);
     errorFile(f2name);
     {$I+}
   n:=0;
   while not eof(f1) do begin
    readln(f1, b1);
    inc(n);
///////////////////////////////////
    While (Pos('  ',b1) <> 0) do begin
     Delete(b1, Pos('  ',b1), 1);
    End;
    l:=length(b1);
     if l < 20 then
      b2:=b1
     else
      begin
       b2:=b1;
       SetLength(b2,20);
      end;
///////////////////////////////////
   writeln(f2, b2);
   writeln(length(b2), '<',b2,'>');
   end;
   close(f1);
   close(f2);
   readln;
end.
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
03.01.2017, 14:58  [ТС] 15
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
56
57
program lab9(input,output);
uses crt;
 
var b1, b2 : string;
    f1name,f2name: string;
    f1,f2: Text;
    i, l, n: integer;
 
procedure errorFile(put:string);
var k: integer;
begin
k:=IOResult;
 if k <> 0 then begin
  writeln ('ошибка #',k,' проверьте искомый файл ', put);
  readln;
  halt (8);
 end;
end;
 
begin
clrscr;
 writeln('Введите путь к текстовому файлу');
  readln(f1name);
 writeln('Куда загружать результат?');
  readln(f2name);
   assign (f1,f1name);
   assign (f2,f2name);
     {$I-}
     reset(f1);
     errorFile(f1name);
     rewrite(f2);
     errorFile(f2name);
     {$I+}
   n:=0;
   while not eof(f1) do begin
    readln(f1, b1);
    inc(n);
///////////////////////////////////
    While (Pos('  ',b1) <> 0) do begin
     Delete(b1, Pos('  ',b1), 1);
    End;
    l:=length(b1);
     if l < 20 then
      b2:=b1
     else
      begin
       b2:=b1;
       SetLength(b2,20);
      end;
///////////////////////////////////
   writeln(f2, b2);
   writeln(length(b2), '<',b2,'>');
   end;
   close(f1);
   close(f2);
   readln;
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7520 / 4384 / 2781
Регистрация: 22.11.2013
Сообщений: 12,545
Записей в блоге: 1
03.01.2017, 17:54 16
Sergey Chepets,
это не решает поставленную задачу.
0
Модератор
9530 / 4858 / 3229
Регистрация: 17.08.2012
Сообщений: 15,202
07.01.2017, 17:31 17
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
ровно 20 символов
Это возможно с вероятностью 1/20. То есть, в большнстве случаев, невозможно.
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
времени слишком мало
Sergey Chepets, а куда подевалось время? Потратили на иные цели?

Да, и нужно уточнить задание. Что именно считать лишними пробелами? Можно ли переносить слова, и, если можно, то нужно ли добавлять знак переноса в конце строки? Напротив, если нельзя разрывать слова, то следует вставлять какое-то количество пробелов в строку, так? Если да, тогда как поступать, если какое-либо слово содержит более 20 символов?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2017, 17:31
Помогаю со студенческими работами здесь

В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов
Доброго времени суток! Прошу помочь мне с одной программкой...ибо она меня уже замучила:) &quot;В...

В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов
В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов...

В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов
В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов...

Скопировать текстовый файл построчно, чтобы в итоговом файле каждая строка содержала 30 литер кроме ";"
может можно сделать иначе ? (программа не работает:cry:) #include &lt;stdio.h&gt; #include &lt;conio.h&gt; ...

Файлы: переформатировать текст, чтобы каждая строка содержала не более 30 литер и заканчивалась точкой
основная часть готова , но я запуталась с переменными т.к. с массивами у меня плохо дела обстоят ,...

Дана строка-предложение, содержащая избыточные пробелы. Преобразовать ее так, чтобы между словами был ровно один пробел
Дана строка-предложение, содержащая избыточные пробелы. Преобразовать ее так, чтобы между словами...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru