Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
hom9k
0 / 0 / 0
Регистрация: 16.04.2009
Сообщений: 2
#1

Потеря символа при копировании строки - C++

19.04.2009, 15:47. Просмотров 2819. Ответов 18
Метки нет (Все метки)

По условию задано количество символов n и текстовый файл. Если длина строки в файле больше n, то ее нужно разбить (оставить n символов на строке, а остаток на новую), там же где количество символов меньше n, то файл нужно дополнить знаками "!". Результат сохранить как f2.txt. В принципе большая часть программы сделана, но есть проблемы с копированием со строки на строку(всегда теряются символы).

Вот кусочек программы...

C++
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
sozdanie()
{
 FILE *f1;
 FILE *f2;
 char a[15],b[1];
 int i,p,n,qw=0;
 printf ("введите количество символов, n=");
 cin>>n;
 cout<<endl;
 printf ("при вводе, в конце каждой строки нажмите Enter;\n");
 printf ("в конце файла введите точку и нажмите клавишу Enter;\n");
 printf ("исходный файл f1:\n");
 f1=fopen ("a:f.txt", "w");
 gets (a);
 p=strlen (a);
 while (a[p-1]!='.')
    {
    if (n<p)
        {
        qw=p/n;
        for (i=1;i<=qw;i++)
            {
            char rab [20];
            strcpy (rab,a+i*n);
            a[i*n]='\n';
            strcpy (a+i*n+1,rab);
            }
        }
    fputs (a,f1);
    gets (a);
    fprintf (f1,"\n");
    p=strlen (a);
    }
  if (n<p)
    {
    qw=p/n;
    for (i=1;i<=qw;i++)
        {
        char rab [20];
        strcpy (rab,a+i*n);
        a[i*n]='\n';
        strcpy (a+i*n+1,rab);
        }
     }
  a[p-1]='\0';
  fputs (a,f1);
  fclose (f1);
  printf ("\n");
  printf ("===============\n");
  f2=fopen ("a:f2.txt","w");
  f1=fopen ("a:f.txt","r");
  while (!feof (f1))
    {
    fscanf (f1,"%s",&a);
    puts (a);
    fprintf (f2,"\n");
    fputs (a,f2);
    p=strlen (a);
    for (i=0;i<(n-p);i++)
        fprintf (f2,"%s","!");
    }
    fclose (f1);
    fclose (f2);
    printf ("\n");
    f2=fopen ("a:f2.txt", "r");
    printf ("файл f2:\n");
    cout<<"===================="<<endl;
    while (!feof(f2))
        {
        fscanf (f2,"%s",a);
        puts (a);
        }
    fclose (f2);
    printf ("конец!\n");
    while (!kbhit());
    menu();
Добавлено через 13 минут 53 секунды
Подскажите где ошибка и где нужно исправить? А то я голову сломал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2009, 15:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Потеря символа при копировании строки (C++):

Лишние символы в конце строки при копировании - C++
При копировании данных в строку (std::string) в цикле, на &quot;стыках&quot; появляются лишние символы. Пример: &lt;meta...

Ошибка при копировании строки в конец файла - C++
Здравствуйте! Написал программу которая ищет заданный символ в текстовом файле и копирует первую строку в которой встречается этот символ в...

Ошибка при чтении символа строки - C++
Здравствуйте! Не могу понять почем эта ошибка мне выбивается при исполнении следующего кода: #define _CRT_SECURE_NO_WARNINGS ...

Ошибка при взятии символа под номером Х из строки - C++
День добрый, дорогие программисты. У меня возникла проблема с использованием textBox1-&gt;Text= Simvoli1.SubString(Y, 1); ...

Как задать конец строки и прекратить при вводе определённого символа? - C++
Добрый день! Подскажите, пожалуйста, как задать конец строки при вводе определённого символа. Например, char mass , но при вводе с...

Как скопировать подстроку из строки до определенного символа? Или удалить, начиная с этого символа - C++
Добрый вечер. Ответ искал, но не нашёл. Предположим, есть строка: ABC|DEF Надо скопировать всё до | , т.е., в приведённом...

18
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
25.04.2009, 02:04 #16
здесь интерфейс (разные части программы используют одни и те же функции для своей работы), а то ты будешь ссылаться, что он в три раза больше твоего
каждую часть можно развивать отдельно и не париться при этом, а чего там будет в остальной части программы (ну, и перечитывать по тридцать раз одно и то же не надо, чтобы помнить а где там что начинается)
0
Вложения
Тип файла: zip print_with_lineno.c.zip (1.3 Кб, 17 просмотров)
Evg
Эксперт CАвтор FAQ
18449 / 6499 / 454
Регистрация: 30.03.2009
Сообщений: 18,128
Записей в блоге: 29
25.04.2009, 11:09 #17
Цитата Сообщение от accept Посмотреть сообщение
здесь интерфейс (разные части программы используют одни и те же функции для своей работы), а то ты будешь ссылаться, что он в три раза больше твоего
На размер ссылаться не буду. Тем более мы считаем, что ты используешь уже готовые и отлаженные процедуры - некоторые строительные блоки, при помощи которых ты строишь программу. И я так понимаю, что условно говоря, код этик блоков не меняется, а потому можем считать, что они положены в дополнительную библиотеку. В этом твой подход В ОБЩЕМ СЛУЧАЕ абсолютно правильный, и я его безоговорочно принимаю

Цитата Сообщение от accept Посмотреть сообщение
каждую часть можно развивать отдельно и не париться при этом, а чего там будет в остальной части программы (ну, и перечитывать по тридцать раз одно и то же не надо, чтобы помнить а где там что начинается)
У меня претензия другого рода к твоей программе. У нас есть конкретная задача - перегнать байты из одного файла в другой. Я написал простой цикл побайтного копирования, глядя на который любой ДРУГОЙ программист поймёт, что тут делается. В твоём случае ты для простого действия задействовал кучу дополнительных процедур. Если бы я не знал, что делает программа, я бы угробил много времени на то, чтобы понять. При не очень детальном просмотре программы, я так и не нашёл того места, где печатается сама строка.

Я просто вот что хочу тебе сказать. Универсальные процедуры - это хорошо. Но только там, где это нужно. На МОЙ ВЗГЛЯД в простых случаях не нужно пытаться использовать что-то универсальное (а потому и, зачастую, громоздкое по своему интерфейсу). К примеру, для нахождения максимального значения из трёх чисел проще написать два if'а, чем использовать какую-нибудь процедуру быстрой сортировки (типа qsort с навороченным интерфейсом и требующей дополнительной пользовательской процедуры). Так же и в данном случае. Когда будет поставлена задача сложной строковой обработки, тогда и стОит использовать твои блоки. Причём, возвращаясь к уже сказанному мной ранее, твоя процедура слабо годится в тех случаях, когда нам действительно нужно считать ЦЕЛИКОМ всю строку, которая может быть длинее, чем MAXLINE. Можно из принципа использовать эти интерфейсы, довыделяя каждый раз буфер, но программа у тебя совершенно перестанет читаться (т.е. её понять будет сложно). В итоге всё выльется в то, что проще будет написать отдельный интерфейс, который читает строку из файла, динаически довыделяя какой-то промежуточный буффер (и используя уже выделенный буффер для чтения следующей строки). Т.е. этом случае твоя процедура оказывается недееспособной
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
25.04.2009, 11:27 #18
Цитата Сообщение от Evg
Причём, возвращаясь к уже сказанному мной ранее, твоя процедура слабо годится в тех случаях, когда нам действительно нужно считать ЦЕЛИКОМ всю строку, которая может быть длинее, чем MAXLINE.
ты не можешь доказать этого, сделай там длину равной трём и всё будет работать
считать строку целиком, так ты её вообще не считываешь, то есть реально работать с ней, как с самостоятельным объектом ты не можешь, ты не можешь взять её и сказать - вот это строка, я щас измерю её или я щас обработаю эту строку (у тебя её нет), ты её перегнал и всё, и нету у тебя её

Цитата Сообщение от Evg
К примеру, для нахождения максимального значения из трёх чисел проще написать два if'а
а я не хочу читать ифы, ифов можно знаешь сколько написать, 1000 строк - ты что, будешь сидеть и читать ифы ? чтобы понять что они делают ? зачем ?
есть функция, я запишу ифы в неё, а потом по её названию буду смотреть что она делает где-либо (понимаешь, в ней двадцать строк, а мне их читать не надо, я читаю одну строку - её вызов), а говорит о том, что твой участок кода написан один раз и срабатывает один раз, потому что ты его пишешь в открытом виде, даже не приходится, ты и сам это понял уже, что одну функцию может юзать любая часть программы, а у меня это всё уже оформлено

ты сказал, что что-то непонятно, приведи пример где непонятно, может ты енамы не знаешь и говоришь, что я непонятно пишу, не нашёл, где выводится строка - так она выводится интерфейсной функцией и он единый для всей программы, для него дописаываются новые функции, а те, которые уже написаны, подключаются к нему же (просто тут всё в одном файле, я подумал, если это разнести, ты может и в файлах ещё запутаешься, а мне это не надо )
0
Evg
Эксперт CАвтор FAQ
18449 / 6499 / 454
Регистрация: 30.03.2009
Сообщений: 18,128
Записей в блоге: 29
25.04.2009, 11:37 #19
Цитата Сообщение от accept Посмотреть сообщение
а у тебя два printf вызова
У тебя тоже два: один внутри PrintLine, другой внутри PrintLineNumber. Если ты этого не заметил, то это опять-таки говорит об излишней громоздкости твоей программы

Добавлено через 9 минут 31 секунду
Цитата Сообщение от accept Посмотреть сообщение
ты не можешь доказать этого, сделай там длину равной трём и всё будет работать
Я же написл - когда строку нужно читать ЦЕЛИКОМ и её обрабатывть (а не просто напечатать)

Цитата Сообщение от accept Посмотреть сообщение
считать строку целиком, так ты её вообще не считываешь, то есть реально работать с ней, как с самостоятельным объектом ты не можешь, ты не можешь взять её и сказать - вот это строка, я щас измерю её или я щас обработаю эту строку (у тебя её нет), ты её перегнал и всё, и нету у тебя её
Зачем мне её обрабатывать, когда задача того не требует?

Цитата Сообщение от accept Посмотреть сообщение
а я не хочу читать ифы, ифов можно знаешь сколько написать, 1000 строк - ты что, будешь сидеть и читать ифы ? чтобы понять что они делают ? зачем ?
есть функция, я запишу ифы в неё, а потом по её названию буду смотреть что она делает где-либо (понимаешь, в ней двадцать строк, а мне их читать не надо, я читаю одну строку - её вызов), а говорит о том, что твой участок кода написан один раз и срабатывает один раз, потому что ты его пишешь в открытом виде, даже не приходится, ты и сам это понял уже, что одну функцию может юзать любая часть программы, а у меня это всё уже оформлено
Т.е. ты напишешь отдельную процедуру, которая ищет максимальное среди двух чисел, отдельную процедуру нахождения максимального среди трёх чисел? А ещё отдельную процедуру для нахождения суммы трёх чисел, а ещё отдельную для нахождения произведения трёх чисел?

Цитата Сообщение от accept Посмотреть сообщение
ты сказал, что что-то непонятно, приведи пример где непонятно, может ты енамы не знаешь и говоришь, что я непонятно пишу, не нашёл, где выводится строка - так она выводится интерфейсной функцией и он единый для всей программы, для него дописаываются новые функции, а те, которые уже написаны, подключаются к нему же (просто тут всё в одном файле, я подумал, если это разнести, ты может и в файлах ещё запутаешься, а мне это не надо )
Я же написал, при не очень внимательном просмотре. Т.е чтобы вникнуть, что у тебя там делается, пришлось внимательно всё смотреть, а так же все процедуры. При этом постоянно скакать по файлу взад-вперёд. Когда ты пишешь что-то один - ну это нормально, потому что свой код понимается легче. Когда ты работаешь в команде из ста человек, и каждый на элементарные вещи начнёт городить код, где с ходусложно что-то понять - работа будет сильно тормозиться. Сам небось видал коды, написанные индусами

Что касаемо for, то лично я использую его как правило только в двух случаях: когда нужен обычный счётчик и когда делается обход структур по типу списочной. Ну и в мелких случаях, где внутренности for'а простые. В этом случае человеку достаточно одного взгляда на это, чтобы понять, что там делается. Потому что это идиоматическая (общепринятая) запись

C
1
2
3
    for (lineno = outsize = 0, putnumber = YES;
         ReadLine(line, MAXLINE, ifp) > 0;
         outsize += PrintLine(line, NULL)) {
Вот такая конструкция, где в хвостовой части for'а стоит вызов процедуры - это дополнительно потраченное время для того, чтобы понять, что тут делается. Если процедура будет большая, то надо дополнительно скакать вверх-вниз, чтобы аккуратно осознать что в каком порядке исполняется. Программист поймёт эту конструкцию - тут вопросов нет. Но время, потерянное на втыкание - сам знаешь, для компаний оборачивается в деньги
0
25.04.2009, 11:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2009, 11:37
Привет! Вот еще темы с ответами:

Создать строку: с начало три символа первой строки, потом эти же три символа в обратном порядке - C++
Помогите пожалуйста! Ввести строку символов. Создать новую строку следующим образом: с начало три символа первой строки, потом эти же три...

Копирование из строки от символа до символа - C++
Как скопировать со строки в другую строку значение от одного какого-либо символа, до другого, и при этом что бы копирование производилось...

Потеря точности при масштабировании - C++
Доброго времени суток может кто-то подскажет алгоритм масштабирования без потери точности,пока я для этого пользуюсь типом double и...

Потеря точности при использовании static_cast - C++
По условию задачи нужно было явное приведение к типу. float n=45.5; int temp=static_cast&lt;int&gt;(n); ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.