Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.87
Askar2008
13 / 13 / 0
Регистрация: 04.03.2009
Сообщений: 154
28.03.2010, 18:11     Скопировать второе слово каждой строки в начало следующей строки #1
Привет, прошу помощи! Заранее спасибо!
Индивидуальное задание:
Скопировать второе слово каждой строки в начало следующей строки
Примечания:
Составить программу, которая читает текстовый файл и выполняет такое преобразование его, какое задано в Вашем варианте индивидуального задания.
Примечания:
1. Имя файла, который подлежит обработке, должно быть параметром программы.
2. Файл должен иметь не менее 10-15 строк текста.
3. Допускается ограничить максимальную длину строки в тексте 80 символами.
4. Допускается (если в индивидуальном задании не оговорено второе) считать, что слова разделяются пробелами, а знаки препинания рассматривать как буквы.
5. Программу следует разрабатывать, исходя из предположения, что весь текст из файла не может быть размещен в оперативной памяти.
6. Допускается создавать при выполнении программы временные файлы, которые не должны сохранятся после окончания программы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2010, 18:11     Скопировать второе слово каждой строки в начало следующей строки
Посмотрите здесь:

Как сделать, чтобы при вводе в консоли <Enter> не переводил курсор на начало следующей строки? C++
C++ Строки в файлах (вывести из каждой строки последнее слово)
Даны два слова.Верно ли,что первое слово начинается на ту же букву,на которую заканчивается второе слово (работа с символами строки) C++
Вывести на экран второе слово введённой пользователем строки C++
C++ Как считать первое слово из каждой строки?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.03.2010, 06:47     Скопировать второе слово каждой строки в начало следующей строки #2
Цитата Сообщение от Askar2008
Скопировать второе слово каждой строки в начало следующей строки
это можно открыть файл
прочитать первую строку
записать в файл вывода пустоту и строку
сохранить второе слово строки отдельно
прочитать вторую строку
записать в файл вывода второе слово и строку
сохранить второе слово строки отдельно
...


записывать можно во временный файл
когда строки закончились, записать его в первоначальный файл (это первоначальный закрыть, потом открыть на запись (содержимое сотрётся), временный перемотать и каждый символ временного перенести в первоначальный)
Askar2008
13 / 13 / 0
Регистрация: 04.03.2009
Сообщений: 154
30.03.2010, 07:01  [ТС]     Скопировать второе слово каждой строки в начало следующей строки #3
Вот примерно накидал код программы, помогите реализовать дальше пожалуйста!
В переменную 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();
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
30.03.2010, 09:05     Скопировать второе слово каждой строки в начало следующей строки #4
дальше можно stringstream применить
а можно sscanf
чтобы второе слово сохранить

Добавлено через 4 минуты
Код
#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)
то же самое в функции - всё вперемешку
Askar2008
13 / 13 / 0
Регистрация: 04.03.2009
Сообщений: 154
31.03.2010, 19:53  [ТС]     Скопировать второе слово каждой строки в начало следующей строки #5
Вот решил задачу, если вдруг пригодится кому - нибудь. Только не знаю как удалять файл, наверно что нибудь наподобии 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();}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.04.2010, 06:40     Скопировать второе слово каждой строки в начало следующей строки #6
C++
1
f2<<slovo<<" "<<str<<endl;
наверное лучше

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

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

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;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
30.11.2010, 13:02     Скопировать второе слово каждой строки в начало следующей строки #10
31 строка вроде лишняя
l123
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
06.12.2010, 20:54     Скопировать второе слово каждой строки в начало следующей строки #11
Переделал, но все равно не получается...

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);
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.12.2010, 00:27     Скопировать второе слово каждой строки в начало следующей строки #12
знаешь, у тебя названия переменных очень короткие
нужно делать такие, чтобы когда читаешь код, не нужно было смотреть, где эти переменные описаны и что они означают

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++)
l123
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
07.12.2010, 10:31     Скопировать второе слово каждой строки в начало следующей строки #13
Спасибо за совет. Учту на будущее... Помогите найти ошибку

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-как признак конца
    }
 Комментарий модератора 
Используйте теги форматирования кода!
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.12.2010, 10:56     Скопировать второе слово каждой строки в начало следующей строки #14
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);
    }
l123
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
07.12.2010, 18:54     Скопировать второе слово каждой строки в начало следующей строки #15
Спасибо. Поясните, плиз, что означает "%*s%19s" в функции sscanf
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
08.12.2010, 00:38     Скопировать второе слово каждой строки в начало следующей строки #16
%*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");
        }
а потом уже делать её как угодно
DjaFaR74
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 47
14.12.2011, 12:32     Скопировать второе слово каждой строки в начало следующей строки #17
Вот что получилось, не компилирует
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;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.12.2011, 12:58     Скопировать второе слово каждой строки в начало следующей строки #18
указатели не понимаешь
inf и kv никуда не указывают
DjaFaR74
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 47
14.12.2011, 14:29     Скопировать второе слово каждой строки в начало следующей строки #19
но без указателей у меня ошибки выдает

Добавлено через 3 минуты
у меня ошибку в цикле выдает 12 строка вроде
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2011, 20:55     Скопировать второе слово каждой строки в начало следующей строки
Еще ссылки по теме:

C++ Строки, символы. вычислить, сколько раз встречается каждый символ в обоих строках, вывести второе слово второй строки в обратном порядке
C++ Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки
Строки. Удалить каждое второе слово C++

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.12.2011, 20:55     Скопировать второе слово каждой строки в начало следующей строки #20
Цитата Сообщение от DjaFaR74 Посмотреть сообщение
но без указателей у меня ошибки выдает
их нужно правильно установить
ты их не устанавливаешь, в них содержатся случайные значения
Yandex
Объявления
14.12.2011, 20:55     Скопировать второе слово каждой строки в начало следующей строки
Ответ Создать тему
Опции темы

Текущее время: 19:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru