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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.87
Askar2008
13 / 13 / 1
Регистрация: 04.03.2009
Сообщений: 154
#1

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

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

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

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

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

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

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

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

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

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


записывать можно во временный файл
когда строки закончились, записать его в первоначальный файл (это первоначальный закрыть, потом открыть на запись (содержимое сотрётся), временный перемотать и каждый символ временного перенести в первоначальный)
1
Askar2008
13 / 13 / 1
Регистрация: 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();
}
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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)
то же самое в функции - всё вперемешку
0
Askar2008
13 / 13 / 1
Регистрация: 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();}
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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;
а то первый пробел пишется
0
l123
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
29.11.2010, 19:52 #7
Люди, подскажите, плиз, как решить эту задачу не используя библиотеки fstream. А используя fgets?
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
30.11.2010, 02:21 #8
это fopen() и fgets()

C
1
fgets(str, sizeof str, ifp);
fgets() отличается от getline() тем, что считывает и сохраняет строку вместе с '\n'
1
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;
}
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
30.11.2010, 13:02 #10
31 строка вроде лишняя
0
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);
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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++)
0
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-как признак конца
    }
 Комментарий модератора 
Используйте теги форматирования кода!
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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);
    }
1
l123
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
07.12.2010, 18:54 #15
Спасибо. Поясните, плиз, что означает "%*s%19s" в функции sscanf
0
07.12.2010, 18:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2010, 18:54
Привет! Вот еще темы с ответами:

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

Вывести на экран второе слово введённой пользователем строки - C++
Вводится строка произвольного текста. Вывести на экран второе слово (слова разделены пробелами).

Приписать второе слово второй строки к первой, развернуть первую строку - C++
Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать второе слово второй строки к первой. Поменять порядок следования...

Вектор строк, вставить в начало каждой строки число - C++
В общем, имеется вектор строк, надо вставить в начало каждой строки число, в частности номер этой строки (1, 2, 3 и т.д.), пробовал вот...


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

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

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