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

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

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

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

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

Привет, прошу помощи! Заранее спасибо!
Индивидуальное задание:
Скопировать второе слово каждой строки в начало следующей строки
Примечания:
Составить программу, которая читает текстовый файл и выполняет такое преобразование его, какое задано в Вашем варианте индивидуального задания.
Примечания:
1. Имя файла, который подлежит обработке, должно быть параметром программы.
2. Файл должен иметь не менее 10-15 строк текста.
3. Допускается ограничить максимальную длину строки в тексте 80 символами.
4. Допускается (если в индивидуальном задании не оговорено второе) считать, что слова разделяются пробелами, а знаки препинания рассматривать как буквы.
5. Программу следует разрабатывать, исходя из предположения, что весь текст из файла не может быть размещен в оперативной памяти.
6. Допускается создавать при выполнении программы временные файлы, которые не должны сохранятся после окончания программы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2010, 18:11     Скопировать второе слово каждой строки в начало следующей строки
Посмотрите здесь:
Скопировать второе слово из каждой строки и вставить их в новый текстовый файл C++
Второе слово второй строки нужно скопировать в первую строку C++
C++ Строки в файлах (вывести из каждой строки последнее слово)
Даны два слова.Верно ли,что первое слово начинается на ту же букву,на которую заканчивается второе слово (работа с символами строки) C++
Строки. Удалить каждое второе слово C++
Как сделать, чтобы при вводе в консоли <Enter> не переводил курсор на начало следующей строки? C++
Вывести на экран второе слово введённой пользователем строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4821 / 3241 / 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
4821 / 3241 / 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 строка вроде
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.12.2011, 20:55     Скопировать второе слово каждой строки в начало следующей строки #20
Цитата Сообщение от DjaFaR74 Посмотреть сообщение
но без указателей у меня ошибки выдает
их нужно правильно установить
ты их не устанавливаешь, в них содержатся случайные значения
DjaFaR74
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 47
17.12.2011, 15:01     Скопировать второе слово каждой строки в начало следующей строки #21
программу переписал, компилится, но не выдает то что нужно, помогите исправить ошибку
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
//максимальная длина строки
#define MAX_STR 1000
//имя второго файла, который будет использоваться
#define FILE2_NAME "output.txt"
//функция, которая определяет является ли символ разделяющим
int split(char c){
        return ((c==' ')||(c==(char)9)||(c=='\0')||(c=='\n'));
};
int fflush(FILE *stream);
int main(int arc, char * argv[])
{
        char * st=argv[1];
        //открываем 2 файла. один для чтения, другой для записи
        FILE *f1;
        FILE *f2=fopen(FILE2_NAME,"w");
        //объявляем строки и целочисленные переменные
        char str[MAX_STR],res[MAX_STR],word[MAX_STR],last[MAX_STR];
        int uk,word_len,res_len,i,end,sch,last_len,z;
        //цикл будет продолжаться до тех пор пока не будет достигнут конец
        //файла - feof(f1)
        /*if (argc==1){
            printf("there is no file name");
            return 1;
        }*/
        f1=fopen(st,"r");
        if (f1==NULL){
            printf("File does not exist");
            return 2;
        }
        last[0]='\0';
        last_len=0;
        while (!feof(f1)){
                //в строку str считывает 1строку из файла, в строку res
                //будем помещать результат для строки str, а в строку word
                //будем помещать текущее слово. res_len, word_len - длины строк
                str[0]='\0';
                //fflush(f1);
                fgets(str,MAX_STR,f1);
                res_len=last_len;
                for (z=0;z<last_len;z++)
                    res[z]=last[z];
                uk=0;
                word_len=0;
                end=0;
                sch=0;
                while (!end){
                        //если символ не разделяющий, то добавляем его в текущее слово
                        if (!split(str[uk])){
                                word[word_len]=str[uk];
                                word_len++;
                        }
                        else{
                                res[res_len++]=str[uk];
                                if (word_len!=0){
                                    if (sch==1){
                                        for (z=0;z<word_len;z++)
                                            last[z]=word[z];
                                        last_len=word_len;
                                        last[last_len]='\0';
                                    } else
                                    for (z=0;z<word_len;z++)
                                        res[res_len++]=word[z];
                                    sch++;
                                    word_len=0;
                                }
                                //когда дошли до конца строки end=1, и цикл закончится
                                if (str[uk]=='\0')
                                        end=1;
                        }
                        //указатель на символ из строки str увеличиваем на 1
                        uk++;
                }
                //выводим строку res в файл она уже будет содержать переход
                //на следующую строку, если это не последная строка
                fputs(res,f2);
        }
        fprintf(f2,"%s ",last);
        //закрываем файлы
        fclose(f1);
        fclose(f2);
        //и снова открываем, только первый файл уже для записи, а второй для
        //считывания
        f1=fopen(st,"w");
        f2=fopen(FILE2_NAME,"r");
        //пока не дойдем до конца файла считываем по 1 строке из 2 файла и
        //записываем в 1 файл
        while (!feof(f2)){
                str[0]='\0';
                fgets(str,MAX_STR,f2);
                fprintf(f1,"%s",str);
        }
        //закрываем файлы
        fclose(f1);
        fclose(f2);
        //удаляем 2 файл
        remove(FILE2_NAME);
        //сообщаем об успешно выполненой задаче
        return 0;
}
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.12.2011, 06:58     Скопировать второе слово каждой строки в начало следующей строки #22
какое задание ?
DjaFaR74
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 47
18.12.2011, 22:38     Скопировать второе слово каждой строки в начало следующей строки #23
Задание то же
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.12.2011, 02:38     Скопировать второе слово каждой строки в начало следующей строки #24
Цитата Сообщение от DjaFaR74 Посмотреть сообщение
программу переписал
а, ну тогда она вообще неправильная
в начале топика описан алгоритм (сообщение)
в середине топика есть фрагмент, выводящий на экран (сообщение)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2011, 17:59     Скопировать второе слово каждой строки в начало следующей строки
Еще ссылки по теме:
Приписать второе слово второй строки к первой, развернуть первую строку C++
C++ Вектор строк, вставить в начало каждой строки число
C++ Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки
C++ Скопировать из файла F1 в файл F2 все строки, кроме той, которая содержит самое короткое слово
C++ Как считать первое слово из каждой строки?

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

Или воспользуйтесь поиском по форуму:
DjaFaR74
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 47
19.12.2011, 17:59     Скопировать второе слово каждой строки в начало следующей строки #25
я в те переменные не врубаюсь
Yandex
Объявления
19.12.2011, 17:59     Скопировать второе слово каждой строки в начало следующей строки
Ответ Создать тему
Опции темы

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