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

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

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

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

11.12.2008, 17:20. Просмотров 4356. Ответов 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
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
16.12.2008, 04:08 #31
Дело в том, что при использовании любого из кодов, предложенных acceptoм, вместо пустых строк в блокноте выводятся просто пустые прямоугольники.
Если не сложно, можете доработать оный код так, чтобы он также копировал инфу из файла 2.тхт, в 1.тхт, а затем 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
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;
    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("2.txt", "wb"))) == NULL)
        return 2;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, ffile.GetCl())) != NULL) 
    {
        nl++;
        if (i == 0) {
            j++;
            i = j;
            fprintf(tfile.GetCl(), "%03d: %s", nl, line);
        } else {
            i--;
            fprintf(tfile.GetCl(),"%03d: \r\n",nl);
        }    
    }
 
    fclose(ffile.GetCl());
    fclose(tfile.GetCl());
 
    return 0;
}
мог бы помучится еще сам, да только время поджимает, завтра сдавать(
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.12.2008, 06:40 #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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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:", nl)
        fprintf(tfp, "%s", (state == OUT ? line : "\r\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);
}
здесь поправил ошибки переносимости и для старых компиляторов и для программ которые не отображают только 0x0A

я смотрел во всех блокнотах которые у меня есть в виндовс и пропустил обычный стандартный
даже в консоли делал type file.txt и всё выводит там без квадратов

насчёт подходящего кода, тебе всё равно придётся делать rewind и remove потом

я чо-то пригляделся что тут
C++
1
2
3
4
    Cl ffile, tfile;
 
    if ((tfile.SetCl(tmpfile())) == NULL)
        return 2;
потом с ним

C++
1
    tfile.rewind();
метод надо создать

потом
C++
1
    ffile.filecopy(tfile);
тоже нужно чтобы работало

остальное вроде если работает то ничо не менять
в итоге у тебя есть файл, создаётся темповый файл где-то там неважно, потом к нему применяются методы которые годятся для любого файла (их надо описать чтобы они работали) и так может тебе поставят зачёт
0
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
16.12.2008, 09:34 #33
Accept, вот теперь квадратов нет, как "\r" поставил, перестали выводится.
Мне тут сказали, что преподу можно только екзешник с тектовым файлом принести и все. Так что может и без классов проканает. А из экзешника вообще как то можно сам код достать?
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.12.2008, 12:27 #34
он может определить на чём написан был код на C или C++ туда добавляется стандартная библиотека у меня для Hello, world! различаются экзешники, но если он так задал, значит ему пофигу, значит ставит просто так, гасить будет летом
0
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
19.12.2008, 10:43 #35
Еще один маленькие вопросы нарисовались.
Код
"%03d:%s",
Зачем нужна данная запись в фпринте?
Код
if ((fp = fopen(fname, [U]"rb"[/U]))
А также что означают вот эти "rb" и "wb" в аргументах фоупена? То, зачем открываем файл - для записи или чтения?

И в данной записи, зачем файловые переменные проверяются на то, не равны ли они NULL? И зачем после этого возвращаются 1 и 2?
Код
 if ((fp = fopen(fname, "rb")) == NULL)
        return 1;
    if ((tfp = tmpfile()) == NULL)
        return 2;
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.12.2008, 12:09 #36
%03d

%3d
вставить десятичное число в поле минимум из трёх символов

%03d
вставить десятичное число в поле минимум из трёх символов, а если оно короче то поставить не пробелы а нули

fopen(fname, "rb")
первое имя файла
второе режим открытия
r - read
w - write
a - append (это write только с присоединением к файлу, а не затиранием)
b - binary (двоичный режим, работает не с набором строк, рассматривая символы конца строки, а с набором байтов, рассматривая символы (или символ) конца строки как просто символ в потоке остальных символов; для виндовс необходимо ставить иначе могут быть глюки какие-то)

функция fopen возвращает NULL в случае ошибки, если она не сможет найти файл, она не сможет его открыть, работать дальше не с чем, программа выходит а код завершения сообщает в систему: так принято что система ноль считает успешным завершением программы, потому все программы возвращают ноль в качестве успешного выполнения и не ноль в качестве неуспешного)
echo %errorlevel%
после любой программы набери и выведется код завершения последней программы
т.к. успешное завершение успешно всегда одинаково а ошибки бывают разные то успех только ноль, а ошибки нумеруются по мере поступления, в идеале на каждую ошибку свой код
ещё делают сообщения для пользователя, коды завершения нужны главным образом процессам (например когда включаешь прогу в скрипт (в виндовс пакетные файлы .bat), то прямо в скрипте можно узнать отработала ли прога или завершилась с ошибками, таким образом можно создавать сложные скрипты, опирающиеся на кучу разных программ, если они все правильно возвращают коды выполнения, то скрипт будет работать однозначно и хорошо информировать пользователя об этапах своей работы)
1
Rendll
0 / 1 / 0
Регистрация: 04.12.2008
Сообщений: 63
21.12.2008, 12:05 #37
Может ктота подскажет как сделать так чтоб можна было сохранять даные в файл, имя файла задаёт пользователь, а потом чтоб можна было с етого файла прочитать ети даные. ТОесть пользователь вводит под каким именем сохр, и с какого файла прочитать даные, вот так вот!
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.12.2008, 00:35 #38
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
#include <stdio.h>
#include <string.h>
 
#define MAXLINE  1000   /* максимальная длина строки */
#define MAXNAME  255    /* максимальное имя файла */
 
/* сохраняет даные в файл, имя файла задаёт пользователь,
   выводит сохранённые данные */
main()
{
    void filecopy(FILE *, FILE *);
    FILE *fp;
    char line[MAXLINE], fname[MAXNAME], *p;
    
    printf("Enter file name: ");
    if ((p = fgets(fname, MAXNAME, stdin)) == NULL)
        return 1;
    sscanf(fname, "%s", fname);    
    if (fopen(fname, "r") != NULL) {
        fprintf(stderr, "error: file is exist\n");
        return 2;
    }
    if ((fp = fopen(fname, "w+")) == NULL) {
        fprintf(stderr, "error: can't create %s\n", fname);
        return 3;
    }    
    printf("Enter data:\n");
    while ((p = fgets(line, MAXLINE, stdin)) != NULL)
        fputs(line, fp);
    rewind(fp);
    putchar('\n');
    printf("Saved:\n");
    filecopy(fp, stdout);
    fclose(fp);
    return 0;
}
 
/* filecopy:  копирование файла ifp в файл ofp */
void filecopy(FILE *ifp, FILE *ofp)
{
    int c;
    
    while ((c = getc(ifp)) != EOF)
        putc(c, ofp);
}
data.txt
Код
file.txt
one two three
four
five
six seven
Код
cat data.txt | ./prog

под виндой

type data.txt | prog.exe
там нет ctrl+D чтобы обозначить конец потока, потому в winXP прога будет ждать ввода, по ctrl+С просто не выведет сохранённый файл на экран

Добавлено через 2 минуты 6 секунд
Код
[guest@localhost tmp]$ ./test
Enter file name: file.txt
Enter data:
one
two
three

Saved:
one
two
three
[guest@localhost tmp]$
это пол линем но там можно ввод закончить через ctrl+D
0
22.12.2008, 00:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2008, 00:35
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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