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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.94
Алексей Студент
#1

Работа со строками - C++

11.12.2008, 17:20. Просмотров 4357. Ответов 37
Метки нет (Все метки)

Товарищи, такая вот проблема. Есть задача. Прочитать строки из файла, а потом записать их следующим образом. Первую оставить, вторую -удалить, на месте её - пустая строка. Третью - оставить, на месте следующих двух - две пустые строки. Шестую - оставить, затем три пустые строки.
При этом все, даже пустые, строки должны быть пронумированы.

Сам написал такой вот бред, но думаю можно проще и правильнее.
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
main()
{
fstream file;
file.open("D:\1.txt",ios::in);
char a[256];
char*s=new char[];
int i=0;
while(!file.eof())
{ 
    file.getline(a,256,"\n");
    for(int j=0; j<(int)(strlen(a));j++)
    {s[i]=a[j];
    i++;}
    s[i]=";";
    i++;
}
file.close();
 
int z=0;
int d=1;
int f=1;
file.open("D:\1.txt",ios::out);
for(int b=0; b<(int)(strlen(s));b++)
{
    file<<s[b];
    if(s[b]==;)
    {
        for(int c=0; c<d; c++)
        {file<<"\n";}
        for(int e=0; e<f; e++)
        {
        while(s[b+1]!=;)
        {z=b+1;}}
    b=z;d++;f++;}
}
file.close();
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2008, 17:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа со строками (C++):

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

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

Работа со строками - C++
Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных (маленьких) латинских букв; между соседними...

Работа со строками - C++
У меня есть есть структурные переменные и указатели на них, естественно. предположим struct name() { char b=&quot;Hello!&quot;; ...

Работа со строками C++ - C++
Задание: Запросить у пользователя массив из 10 строк и вывести на экран те, которые равны слову «Ура». #include &quot;stdafx.h&quot; #include...

Работа со строками в СИ++ - C++
Парни помагите напишите прогу если не втягость заранее благодарю))) Вот условие: Дана строка. Преобразовать ее, удалив каждый символ *...

37
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.12.2008, 20:00 #2
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
#include <stdio.h>
 
#define MAXLINE  1000    /* максимальная длина строки */
#define IN  1            /* внутри пропусков */
#define OUT 0            /* снаружи пропусков */
 
/* читает строки из файла, а потом записывает их определённым образом 
   первую оставить, вторую - удалить, на месте её - пустая строка и т.д. */
main()
{
    FILE *fp;
    char line[MAXLINE], *p;
    int state;
    long i, j, nl;
        
    if ((fp = fopen("file.txt", "rb")) == NULL)
        return 1;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, fp)) != NULL) {
        nl++;
        if (i == 0) {
            j++;
            i = j;
            state = OUT;
        } else {
            i--;
            state = IN;
        }    
        printf("%03d:%s", nl, (state == OUT ? line : "\n"));
    }
    fclose(fp);
    return 0;
}
0
Алексей Студент
12.12.2008, 03:27 #3
Спс. Еще один вопрос - это можно реализовать через класс? (Чтобы файловая переменная принадлежала к классу и была типа Private)
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 86
12.12.2008, 03:41 #4
есть класс CFile
0
Алексей Студент
12.12.2008, 04:55 #5
Про сифайл слышал. Тут дело в другом, надо создать свой собственный класс(пусть будет class1), в котором обьявить файловую переменную(в данном случае это fp) типа private. И чтобы в коде мейна она уже фигурировала как class1.fp. Такое вот задание препод дал.
И еще один вопрос, по коду, который дал accept. Файл он открывает и в консоли записывает все правильно, но вот обратно в файл не записывает. Можете с этим помочь?
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.12.2008, 07:58 #6
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
#include <stdio.h>
 
#define MAXLINE  1000    /* максимальная длина строки */
#define IN  1            /* внутри пропусков */
#define OUT 0            /* снаружи пропусков */
 
/* читает строки из файла, а потом записывает их определённым образом 
   первую оставить, вторую - удалить, на месте её - пустая строка и т.д.;
   с перезаписью файла */
main()
{
    void filecopy(FILE *, FILE *);
    FILE *fp, *tfp;
    char line[MAXLINE], *p;
    int state;
    long i, j, nl;
    const char *fname = "file.txt";
        
    if ((fp = fopen(fname, "rb")) == NULL)
        return 1;
    if ((tfp = tmpfile()) == NULL)
        return 2;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, fp)) != NULL) {
        nl++;
        if (i == 0) {
            j++;
            i = j;
            state = OUT;
        } else {
            i--;
            state = IN;
        }    
        fprintf(tfp, "%03d:%s", nl, (state == OUT ? line : "\n"));
    }
    fclose(fp);
    rewind(tfp);
    if ((fp = fopen(fname, "wb")) == NULL)
        return 3;
    filecopy(tfp, fp);
    fclose(tfp);
    fclose(fp);
    return 0;
}
 
/* filecopy:  копирование файла ifp в файл ofp */
void filecopy(FILE *ifp, FILE *ofp)
{
    int c;
    
    while ((c = getc(ifp)) != EOF)
        putc(c, ofp);
}
может быть можно как-то отрезать от исходного файла часть по окончании работы, т.к. из-за пустых строк файл теряет размер (не будешь же пробелы сохранять), темповый файл - стандарт
классы это уже цпп, я пока с сишником
1
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 86
12.12.2008, 10:08 #7
ну если препод так хочет, то можно показать ему следующее
C++
1
class MyFile : public CFILE
и пусть грызет локти)
только не совсем понятно, что он подразумевает под "переменной типа файл". если структуру FILE .. то возникает другой вопрос - на кой черт огород городить, если все и так огорожено.

C++
1
2
3
4
5
6
7
8
9
class MyFile
{
private:
FILE * fp;
pubilc:
MyFile();
void filecopy(FILE *, FILE *);
~MyFile();
}
но коли переменная объявлена как private, обратиться к ней просто через точку не получится. ибо на то она и private. Видимо товарищ препод добивается от вас еще и написания функция, позволяющих менять это самое fp, например

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyFile
{
private:
FILE * fp;
pubilc:
MyFile();
void filecopy(FILE *ftc1, FILE *ftc2);
*FILE GetMyFile();
void SetMyFile (FILE* fts);
~MyFile();
}
 
FILE*MyFile::GetMyFile()
{
return fp;
}
 
void MyFile::SetMyFile (File * fts)
{
fp=fts;
}
1
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
12.12.2008, 16:04 #8
Ага, то есть переменные private доступны только для функции, обьявленной в этом же классе? Ногами просьба не бить, просто мы си проходим только месяц, а на допуск к экзамену сказал эту прогу сделать, просто беда(
Так а может в классе обьявить как привейт непосредственно файловую переменную и как паблик функцию, в описание которой запихать потом код, данный acceptom? Так получится?
Accept, небольшая просьба. Можешь сделать комментарии к твоему коду, хотя бы примерные. А то я в нем две трети операторов не знаю, а преподу надо что то сказать)
0
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 86
12.12.2008, 17:10 #9
Именно так, приват для того и сделан чтобы функции - не члены класса не имели доступ к этим переменным. Пересадить функции accept'а в класс еще как получится, именно так и надо сделать дабы угодить вашему преподу. Попробуйте сами, компилятора нет под рукой, да и пользительно будет_)
0
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
12.12.2008, 17:45 #10
Вот хочу пойти наиболее простым путем и в классе обьявить лишь функцию filecopy, как паблик, и переменную ifp, как привейт. Преподу пофиг, что именно сделал в классе, главное чтоб файлофая переменная там была, и к ней ты потом образался.
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
#include <stdio.h>
 
#define MAXLINE  1000    
#define IN  1            
#define OUT 0            
class cl
{private: FILE*ifp;
public: void filecopy(FILE*,FILE*);
};
 
 
void cl::filecopy(FILE *ifp, FILE *ofp)
{ cl z;
    int c;
    
    while ((c = getc(z.ifp )) != EOF)
        putc(c, ofp);
}
 
 
main()
{ cl y;
        FILE *fp, *tfp;
    char line[MAXLINE], *p;
    int state;
    long i, j, nl;
    const char *fname = "file.txt";
        
    if ((fp = fopen(fname, "rb")) == NULL)
        return 1;
    if ((tfp = tmpfile()) == NULL)
        return 2;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, fp)) != NULL) {
        nl++;
        if (i == 0) {
            j++;
            i = j;
            state = OUT;
        } else {
            i--;
            state = IN;
        }    
        fprintf(tfp, "%03d:%s", nl, (state == OUT ? line : "\n"));
    }
    fclose(fp);
    rewind(tfp);
    if ((fp = fopen(fname, "wb")) == NULL)
        return 3;
    y.filecopy(tfp, fp);
    fclose(tfp);
    fclose(fp);
    return 0;
}
Так вот, хочу сразу в конструторе filecopy прописать некую классовую переменную, и с помощью её же через точку в этом же конструкторе обращаться к ifp. Это возможно? Вот что то написал.
При компиляции данного кода ошибок не выдает, лишь одно предупреждение
warning C4700: local variable 'z' used without having been initialized
Но программа не работает. Наверное раннее описанное мной предложение все же технически невозможно)
0
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 86
12.12.2008, 20:54 #11
вот смотри. у тебя функция filecopy является членом класса cl, стало быть она уже имеет ссылку на один объект этого класса, для которого функция вызывается. и в качестве параметра она по идее должна бы получать объект того же класса. Полшага до переопрееления операторов, так сказать. думаю с этим вы еще столкнетесь.

У вас же получается что функция хоть и является методом класса, но к приватной его части никак не обращаяется.

И уж если городить огород, то надо бы прописать конструктор, функции о которых я упоминал выше, и работать уже с объектами вашего класса, а не со стандартными структурами FILE

Добавлено через 41 минуту 15 секунд
в функции accept, есть неточность. ибо не j++ а j=1.

ну и вот что в итоге
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
#include <stdio.h>
 
#define MAXLINE  1000    
#define IN  1            
#define OUT 0 
           
class Cl{
private: 
    FILE*ifp;
public: 
    FILE* GetCl();
    int SetCl (FILE* fts);
    void filecopy(Cl z);
};
 
 
void Cl::filecopy(Cl z)
{
    int c;
     while ((c = getc(z.ifp )) != EOF)
        putc(c, ifp);
}
 
FILE* Cl::GetCl()
{
    return ifp;
}
//это по сути конструктор с параметром
int Cl::SetCl (FILE * fts)
{
    if(fts==NULL)
        return 0;
    else
    {
        ifp=fts;
        return 1;
    }
}
 
main()
{ Cl ffile, tfile;
    char line[MAXLINE], *p;
    int state;
    long i, j, nl;
    const char *fname = "file.txt"; // отсюда читаем
    const char *tname = "temp.txt"; // сюда пишем
 
        //file.txt должен существовать
    if ((ffile.SetCl(fopen(fname, "rb"))) == NULL)
        return 1;
//temp.txt если не существует - будет создан
    if ((tfile.SetCl(fopen(tname, "wb"))) == NULL)
        return 2;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, ffile.GetCl())) != NULL) {
        nl++;
        if (i == 0) {
//вот тут была ошибка, иначе читалось только две строки. потом j=3, i=2 и все ..
            j=1;
            i = j;
            state = OUT;
        } else {
            i--;
            state = IN;
        }    
        fprintf(tfile.GetCl(), "%03d:%s", nl, (state == OUT ? line : "\n"));
    }
    fclose(ffile.GetCl());
    fclose(tfile.GetCl());
    return 0;
}
проверил. работает.
1
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.12.2008, 23:20 #12
//вот тут была ошибка, иначе читалось только две строки. потом j=3, i=2 и все ..
j=1;
наоборот у меня было без ошибок ты переделал с ошибкой, задание прочитай
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
#include <stdio.h>
 
#define MAXLINE  1000    /* максимальная длина строки */
#define IN  1            /* внутри пропусков */
#define OUT 0            /* снаружи пропусков */
 
/* читает строки из файла, а потом записывает их определённым образом 
   первую оставить, вторую - удалить, на месте её - пустая строка и т.д.;
   с перезаписью файла */
main()
{
    void filecopy(FILE *, FILE *); // функция будет использоваться в этой области
    FILE *fp, *tfp;
    char line[MAXLINE], *p;
    int state;
    long i, j, nl;
    const char *fname = "file.txt";
        
    if ((fp = fopen(fname, "rb")) == NULL)
        return 1;
    if ((tfp = tmpfile()) == NULL)
        return 2;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, fp)) != NULL) { // NULL будет когда файл закончится
        nl++; // считает каждую строку
        if (i == 0) { // пока i > 0 вставлять пустые строки
            j++; // сколько пустых строк вставлять на этот раз (должно расти по условию)
            i = j; // ставит верхнюю границу, которую снижает до нуля
            state = OUT; // флаг - выводить строку
        } else {
            i--; // сколько ещё пустых строк осталось вывести
            state = IN; // флаг - скрыть строку
        }
        // флаг управляет выводом:
        // что вывести с номером? строку или пустую строку
        fprintf(tfp, "%03d:%s", nl, (state == OUT ? line : "\n"));
    }
    fclose(fp);
    rewind(tfp); // переводит указатель темпового файла в начало, т.к. туда писались строки
    if ((fp = fopen(fname, "wb")) == NULL) // файл может иметь только право на чтение, проверит
        return 3;
    filecopy(tfp, fp);
    fclose(tfp); // стирает темповый файл
    fclose(fp);
    return 0;
}
 
/* filecopy:  копирование файла ifp в файл ofp */
void filecopy(FILE *ifp, FILE *ofp)
{
    int c;
    
    while ((c = getc(ifp)) != EOF)
        putc(c, ofp);
}
Добавлено через 7 минут 40 секунд
const char *tname = "temp.txt"; // сюда пишем
в каталоге может быть запрет на изменение списка файлов

//temp.txt если не существует - будет создан
не будет создан

и программу закинуть в такой каталог можно - моя сработает а твоя завалится

Добавлено через 4 минуты 6 секунд
и ещё там может лежать файл temp.txt в котором уже может быть что-то важное (от другой программы например твоей же такой же)

Добавлено через 1 минуту 14 секунд
так что сначала у себя в голове ошибки исправь

Добавлено через 11 минут 18 секунд
//вот тут была ошибка, иначе читалось только две строки
всё там правильно
1
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 86
13.12.2008, 00:08 #13
оххо. сколько агрессии. accept, давай пиписьками меряться не будем, а? Я всего лишь хотел помочь автору. Ошибки в j++ действительно нет, ошибка тут:
C++
1
fprintf(tfp, "%03d:%s", nl, (state == OUT ? line : "\n"));
, ибо не каждую итерацию цикла каретка смещается на новую строку, потести - увидишь.

Автору удачи.
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.12.2008, 01:40 #14
давай пиписьками меряться
мне вообще пофиг это тебя заботит

Я всего лишь хотел помочь автору.
и переделал код с ошибкой, медвежья услуга, лучше у себя ошибки поищи

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

\r перед \n пусть добавит и то, если потребуется

Добавлено через 52 минуты 43 секунды
я нашёл причину, перешёл в виндовс и скомпилировал в bc3.1, не работает даже консоль
но у меня есть lcc и я написал код в соответствии стандарту ANSI (это 89 год), потому когда я применил lcc для компиляции, сработала как и консоль так и запись в файл и даже без \r
а в bc3.1 не сработала вообще конструкция ?:
потому тебе кажется что там ошибка
0
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
13.12.2008, 03:45 #15
FOLKEN, вот в твоем коде заменил фнейм и тнейм на имя файла 1.тхт, лежащего у меня в папке проекта.
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
#include <stdio.h>
 
#define MAXLINE  1000    
#define IN  1            
#define OUT 0 
           
class Cl{
private: 
    FILE*ifp;
public: 
    FILE* GetCl();
    int SetCl (FILE* fts);
    void filecopy(Cl z);
};
 
 
void Cl::filecopy(Cl z)
{
    int c;
     while ((c = getc(z.ifp )) != EOF)
        putc(c, ifp);
}
 
FILE* Cl::GetCl()
{
    return ifp;
}
 
int Cl::SetCl (FILE * fts)
{
    if(fts==NULL)
        return 0;
    else
    {
        ifp=fts;
        return 1;
    }
}
 
main()
{ Cl ffile, tfile;
    char line[MAXLINE], *p;
    int state;
    long i, j, nl;
    const char *fname = "file.txt"; 
    const char *tname = "temp.txt"; 
 
            if ((ffile.SetCl(fopen("1.txt", "rb"))) == NULL)
        return 1;
 
    if ((tfile.SetCl(fopen("1.txt", "wb"))) == NULL)
        return 2;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, ffile.GetCl())) != NULL) {
        nl++;
        if (i == 0) {
 
            j=1;
            i = j;
            state = OUT;
        } else {
            i--;
            state = IN;
        }    
        fprintf(tfile.GetCl(), "%03d:%s", nl, (state == OUT ? line : "\n"));
    }
    fclose(ffile.GetCl());
    fclose(tfile.GetCl());
 
    return 0;
    
}
Но прога у меня лишь стирает все содержимое из 1.тхт, и ничего туда не пишет.
Кстати функция файлкопи у тебя описана, но в мейне не вызывается. Так и должно быть?
0
13.12.2008, 03:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2008, 03:45
Привет! Вот еще темы с ответами:

Работа со строками - C++
Дан текст.Выделить все слова,которые не содержат одинаковых символов.Различие строчных и прописных букв во внимание не принимать. ...

Работа со строками C++ - C++
Решил посвятить этой проблеме отдельную тему. В попытке написать ответ к этой задаче на С++ запнулся на работе со строками. Собственно...

Работа со строками - C++
Подсчитать количество вхождений слова «мама» в строку и вывести номера первых позиций этих вхождений. Если этого слова в строке нет, то...

Работа со строками - C++
Помогите пожалуйста нужна функция копирования из одной строки в другую начиная с к символов.Вот прототип void copy(char *str1,int k,char...


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

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

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