Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/48: Рейтинг темы: голосов - 48, средняя оценка - 4.50
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154

Скопировать второе слово каждой строки в начало следующей строки

28.03.2010, 18:11. Показов 9289. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, прошу помощи! Заранее спасибо!
Индивидуальное задание:
Скопировать второе слово каждой строки в начало следующей строки
Примечания:
Составить программу, которая читает текстовый файл и выполняет такое преобразование его, какое задано в Вашем варианте индивидуального задания.
Примечания:
1. Имя файла, который подлежит обработке, должно быть параметром программы.
2. Файл должен иметь не менее 10-15 строк текста.
3. Допускается ограничить максимальную длину строки в тексте 80 символами.
4. Допускается (если в индивидуальном задании не оговорено второе) считать, что слова разделяются пробелами, а знаки препинания рассматривать как буквы.
5. Программу следует разрабатывать, исходя из предположения, что весь текст из файла не может быть размещен в оперативной памяти.
6. Допускается создавать при выполнении программы временные файлы, которые не должны сохранятся после окончания программы.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.03.2010, 18:11
Ответы с готовыми решениями:

Скопировать второе слово из каждой строки и вставить их в новый текстовый файл
Добрый вечер, помогите, пожалуйста, в реализации простенькой программы: На входе .txt файл, в котором некое множество строк, состоящих...

Второе слово второй строки нужно скопировать в первую строку
дано 2 строки, каждые имеют 5 слов с пробелами, нужно обычным способом составить код чтобы 2-ое слово 2-ой строки нужно скопировать в 1-ую...

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

24
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.03.2010, 06:47
Цитата Сообщение от Askar2008
Скопировать второе слово каждой строки в начало следующей строки
это можно открыть файл
прочитать первую строку
записать в файл вывода пустоту и строку
сохранить второе слово строки отдельно
прочитать вторую строку
записать в файл вывода второе слово и строку
сохранить второе слово строки отдельно
...


записывать можно во временный файл
когда строки закончились, записать его в первоначальный файл (это первоначальный закрыть, потом открыть на запись (содержимое сотрётся), временный перемотать и каждый символ временного перенести в первоначальный)
1
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154
30.03.2010, 07:01  [ТС]
Вот примерно накидал код программы, помогите реализовать дальше пожалуйста!
В переменную buff считывается строка.
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
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
void main()
{
 clrscr();
 char buff[81],str[81];
 ifstream infile;
 ofstream outfile("output.txt");
 infile.open("text.txt");
 int i=0;
 while (!infile.eof())
 {
   infile.getline(buff,sizeof(buff));
   cout<<buff<<endl;
  /* while (i!=2)
   {
     if (i==1) str=buff[i];
     i++;
   }
 
   for (int i=0;i<strlen(buff);i++)
   {
    if (buff)
   }*/
 }
 outfile.close();
 infile.close();
 getch();
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.03.2010, 09:05
дальше можно stringstream применить
а можно sscanf
чтобы второе слово сохранить

Добавлено через 4 минуты
Code
1
2
3
4
5
6
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
void main()
C
1
2
#include <stdio.h>
#include <string.h>
эти относятся к C

C
1
#include <conio.h>
это к компилятору

C++
1
2
#include <iostream.h>
#include <fstream.h>
эти к C++

C
1
void main()
эта версия функции не возвращает в операционную систему код завершения программы

C
1
int main(void)
то же самое в функции - всё вперемешку
0
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154
31.03.2010, 19:53  [ТС]
Вот решил задачу, если вдруг пригодится кому - нибудь. Только не знаю как удалять файл, наверно что нибудь наподобии erase. А еще, если кто может посоветовать более удобный метод нахождения второго слова из строки напишите, т.к. нет предела совершенству, хочу узнать побольше вариантов. Заранее спасибо!
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
#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <fstream.h>
 void main()
{
 clrscr();
 char str[81];
 char slovo[20]="";
 ifstream f1; 
 ofstream f2("temp.txt"); 
 f1.open("file.txt");
 while (!f1.eof())
 {
  f1.getline(str,sizeof(str));
  cout<<str<<endl;
  f2<<slovo<<" "<<str<<endl;
  int i=0;
  int n=0;
  while (i<strlen(str))
  {
    if (str[i]==' ')
     {
       slovo[n]=str[i+1];
       n++;
     }
    i++;
  }
 }
 f1.close();
 f2.close();
ifstream f3; 
 ofstream f4("file.txt"); 
 f3.open("temp.txt");
 while (!f3.eof())
 {
  f3.getline(str,sizeof(str));
  f4<<str<<endl;
 }
 f3.close();
 f4.close();
 getch();}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.04.2010, 06:40
C++
1
f2<<slovo<<" "<<str<<endl;
наверное лучше

C++
1
2
3
4
    if (slovo[0] == '\0')
        f2 << str << endl;
    else
        f2 << slovo << " " << str << endl;
а то первый пробел пишется
0
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
29.11.2010, 19:52
Люди, подскажите, плиз, как решить эту задачу не используя библиотеки fstream. А используя fgets?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.11.2010, 02:21
это fopen() и fgets()

C
1
fgets(str, sizeof str, ifp);
fgets() отличается от getline() тем, что считывает и сохраняет строку вместе с '\n'
1
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
30.11.2010, 12:52
Написал вот такой кусок, но не могу найти ошибку...

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
char filename[80];     /* имя файла */
char bu1[81], bu2[81]; /* входной и выходной буферы */
 
int main(int an, char *av[]) {
 char *b1, *b2,*bv; /* текущие указатели в буферах */
 char os;       /* предыдущий символ */
 FILE *inf, *outf;  /* файловые переменные */
 
 int  nw,k=0,       /* количество слов */
      lmax     
 
  if (an<2) {
    printf("Call parameter wasn't be written(The name of input file)\n");
    exit(0);
    }
  strcpy(filename,av[1]);
  //открытие файлов
  if ((inf=fopen(filename,"r"))==NULL) {
    printf("Impossible to open file: %s\n",filename);
    exit(0);
    }
  if ((outf=fopen("1.txt","w"))==NULL) {
    printf("Impossible to create file: TMP\n");
    exit(0);
    }
  fgets(bu2,80,inf);
  b2=bu2;
  b2+=80;
  for (lmax=0; fgets(bu1,80,inf)!=NULL; lmax++) {
    if (lmax>0) for (i=1;i<=k;i++) *b2++=*bv++; //если считывается 2 строка, то первым словом записываем уже сохраненное 2-ое
 
    for (os=' ',nw=0,k=0,b1=bu1; *b1; os=*b1++) {
      switch(*b1)
      {
    case 0xA: break; //символ новой строки удаляется
    case ' ': if (os==' ') break; //2-й пробел подряд удаляется
    default:  if (os==' ') nw++; //счетчик слов
 
     if (nw==1)
       {
         *bv++=*b1; cout<<*b1;//если 2 слово, то запоминаем в bv
         k++;
       }
     if ((lmax>0)&&(nw>0)) *b2++=*b1;break; //остальные символы переписываются
       }
    }
      fprintf(outf," %s\n",bu2);
 
    }
  fclose(inf);
  fclose(outf);
 
  getch();
  return 0;
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.11.2010, 13:02
31 строка вроде лишняя
0
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
06.12.2010, 20:54
Переделал, но все равно не получается...

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
char filename[80];     /* имя файла */
char bu1[81], bu2[81]; /* входной и выходной буферы */
 
int main(int an, char *av[]) {
 char *b1, *b2,*bv; /* текущие указатели в буферах */
 char os;       /* предыдущий символ */
 FILE *inf, *outf;  /* файловые переменные */
 
b2=bu2;
 
  for (int lmax=0; fgets(bu1,80,inf)!=NULL; lmax++)
  {
 
    if (lmax>0) while (*kv) *b2++=*kv++;       //если не первая строка, то скопировать указатель на второе слово в выходной буфер
    kv=kk;
    for (os=' ',nw=0,b1=bu1; *b1; os=*b1++)
    {
      switch(*b1)
      {
    case 0xA: break;       //если конец строки
    case ' ': if (os==' ') break;//если предыдущий был пробел, то удаляем
    default:  if (os==' ') nw++;//если пробел, то увеличим счетчик слов
 
     if (nw==1) *kv++=*b1;//если второе слово, то запишем в указатель
     if (lmax==0) *b2++=*b1;//если первая строка, то перепишем всю строку
     if ((lmax>0)&&(nw>0)) *b2++=*b1;break;
      }
      *kv=0;//добавим в конец слова 0-как признак конца
    }
    fprintf(outf," %s\n",bu2);
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.12.2010, 00:27
знаешь, у тебя названия переменных очень короткие
нужно делать такие, чтобы когда читаешь код, не нужно было смотреть, где эти переменные описаны и что они означают

C
1
for (os=' ',nw=0,b1=bu1; *b1; os=*b1++)
вот пример, если ты его откроешь через несколько месяцев, ты не поймёшь ничего
какие-то переменные, сначала нужно сидеть, запоминать, что означает каждая

C
1
2
3
for (prevchar = ' ', nwords = 0, bufinptr = bufin;
     *bufinptr != '\0';
     prevchar = *bufinptr++)
0
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
07.12.2010, 10:31
Спасибо за совет. Учту на будущее... Помогите найти ошибку

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
char secondword[20];
bufout=bufoutptr;
 
  for (int strnum=0; fgets(bufinptr,80,inf)!=NULL; strnum++)
  {
 
    if (strnum>0) while (*wpoint) *bufout++=*wpoint++;       //если не первая строка, то скопировать указатель на второе слово в выходной буфер
    wpoint=secondword;
    for (prevchar = ' ', nwords = 0, bufinptr = bufin;
     *bufinptr != '\0';
     prevchar = *bufinptr++)
    {
      switch(*bufin)
      {
        case 0xA: break;       //если конец строки
        case ' ': if (prevchar==' ') break;//если предыдущий был пробел, то удаляем
        default:  if (prevchar==' ') nwords++;//если пробел, то увеличим счетчик слов
 
         if (nwords==1) *wpoint++=*bufin;//если второе слово, то запишем в указатель
         if (strnum==0) *bufout++=*bufin;//если первая строка, то перепишем всю строку
         if ((strnum>0)&&(nwords>0)) *bufout++=*bufin;break;
      }
      *wpoint=0;//добавим в конец слова 0-как признак конца
    }
 Комментарий модератора 
Используйте теги форматирования кода!
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.12.2010, 10:56
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    int firstline;
    const  char *delimeter = " ";
 
    firstline = 1;
    while (fgets(line, sizeof line, ifp) != NULL) {
        char secword[20]; 
        if (!firstline)
            if (sscanf(line, "%*s%19s", secword) != 1)
                printf("can't read second word" "\n");
        
        if (firstline) {
            firstline = 0;
            fprintf(ofp, "%s", line);
        } else
            fprintf(ofp, "%s%s%s", secword, delimeter, line);
    }
1
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
07.12.2010, 18:54
Спасибо. Поясните, плиз, что означает "%*s%19s" в функции sscanf
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
08.12.2010, 00:38
%*s - прочитать слово до пробельного символа, но не сохранять его
%19s - прочитать слово, пропустив перед ним пробельные символы, не более 19 символов
в 20й символ запишется нуль-символ

если у тебя там слова разделены любым разделителем, то можно сформировать такую форматную строку заранее с помощью функции sprintf()
а вообще, конечно, лучше сделать

C
1
2
3
4
5
6
7
8
int get_second_word(char *secword, size_t swsize, const char *line, size_t lsize);
 
...
 
        if (!firstline) {
            int retval = get_second_word(secword, sizeof secword, line, strlen(line));
            assert (retval == 0 && "can't read second word");
        }
а потом уже делать её как угодно
0
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 47
14.12.2011, 12:32
Вот что получилось, не компилирует
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
using namespace std;
char filename[80];     /* имя файла */
char bu1[81], bu2[81]; /* входной и выходной буферы */
 
int main(int an, char *av[]) {
 char *b1, *b2,*bv,nw,*kv,*kk; /* текущие указатели в буферах, новое слово  */
 char os;       /* предыдущий символ */
 FILE *inf, *outf;  /* файловые переменные */
 
b2=bu2;
 
  for (int lmax=0; fgets(bu1,80,inf)!=NULL; lmax++)
  {
 
    if (lmax>0) while (*kv) *b2++=*kv++;       //если не первая строка, то скопировать указатель на второе слово в выходной буфер
    kv=kk;
    for (os=' ',nw=0,b1=bu1; *b1; os=*b1++)
    {
      switch(*b1)
        {
        case 0xA: break;       //если конец строки
        case ' ': if (os==' ') break;//если предыдущий был пробел, то удаляем
        default:  if (os==' ') nw++;//если пробел, то увеличим счетчик слов
 
         if (nw==1) *kv++=*b1;//если второе слово, то запишем в указатель
         if (lmax==0) *b2++=*b1;//если первая строка, то перепишем всю строку
         if ((lmax>0)&&(nw>0)) *b2++=*b1;break;
      }
   *kv=0;//добавим в конец слова 0-как признак конца
    }
  fprintf(outf," %s\n",bu2);
 
    }
  fclose(inf);
  fclose(outf);
 
 
  system("pause");
  return 0;
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.12.2011, 12:58
указатели не понимаешь
inf и kv никуда не указывают
0
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 47
14.12.2011, 14:29
но без указателей у меня ошибки выдает

Добавлено через 3 минуты
у меня ошибку в цикле выдает 12 строка вроде
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.12.2011, 20:55
Цитата Сообщение от DjaFaR74 Посмотреть сообщение
но без указателей у меня ошибки выдает
их нужно правильно установить
ты их не устанавливаешь, в них содержатся случайные значения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.12.2011, 20:55
Помогаю со студенческими работами здесь

Сравнить каждое слово из заданной строки с первый словом каждой строки в файле
Ребят, помогите!!! Уже наверное неделю мучаюсь(( Что не так? все время какие то ошибки. Задача такова: Нужно сравнить каждое слово из...

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

Даны два слова.Верно ли,что первое слово начинается на ту же букву,на которую заканчивается второе слово (работа с символами строки)
2)Даны два слова.Верно ли,что первое слово начинается на ту же букву,на которую заканчивается второе слово (работа с символами строки)

Строки. Удалить каждое второе слово
Например вводим : Dobruy vecher gorod Выводим : Dobruy gorod Заранее спасибо!

Как сделать, чтобы при вводе в консоли <Enter> не переводил курсор на начало следующей строки?
Есть некий ввод символов, организованный через cin.get(char &amp;), или через cin.get(char &amp;, int), или через cin.getline(char &amp;, int)....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru