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

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

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

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

11.12.2008, 17:20. Просмотров 4361. Ответов 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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 85
13.12.2008, 04:20 #16
вместо j=1 надо j++, accept тут совершенно прав. И посмотри на свой код. ты открываешь файл 1.txt а пишешь в temp.txt

filecopy как-то и не особо нужна оказалась. Если обязательно нужно ее использовать - бери пример accept'a, если нужен пример с классами - можешь взять вот это (теперь точно все работает как надо)

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
#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(fname, "rb"))) == NULL)
        return 1;
 
    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++;
            i = j;
            fprintf(tfile.GetCl(), "%03d: %s\n", nl, line);
        } else {
            i--;
            fprintf(tfile.GetCl(),"%03d: \r\n",nl);
        }    
    }
    fclose(ffile.GetCl());
    fclose(tfile.GetCl());
    return 0;
}
1
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 26
13.12.2008, 09:01 #17
Спс, это пример работает.
Остались два небольших вопроса.
В файле, в который прога записывает результат, после строк, которые остаются(1,3,6 и т.д) печатаются три пустых прямоугольника(непечатных символа). Это как нибудь решается?
И еще, можно сделать так, чтобы прога выдавала результат в тот же файл, из которого брала исходные строки, или можно только в новый?
Так, первый вопрос решил сам просто убрал из этой строки /n.
C++
1
fprintf(tfile.GetCl(), "%03d: %s\n", nl, line);
Остался вопрос про запись в тот же файл, из которого взяты исходные данные.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
13.12.2008, 12:18 #18
качайте нормальный компилятор (по стандарту он должен читать из файла перенос строки какой бы он ни был и переводить его в \n, а \n при выводе переводить в перевод строки родной для системы, даже если он двойной)
http://www.q-software-solutions.de/pub/lccwin32.exe

очень интересно это после супер-кода temp.txt остаётся на диске ?

Код
"%03d: %s\n", nl, line);
зря так сделал - поменял смысл, в строке уже есть \n когда она попадает в line из файла (fgets не отбрасывает конец строки)
а так это и не ты сделал, это опять FOLKEN

FOLKEN не трогай мой код, ты не шаришь, ты какого хера темповый файл заменил на свой ? который в итоге как мусор болтается после работы проги
и возврат каретки можно не делать, т.к. это получается лишнее действие (ненужное то есть)
0
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 85
13.12.2008, 12:56 #19
Автор, юзай вышеописанную filecopy.

accept, с вами разговор окончен, всего хорошего
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
13.12.2008, 13:17 #20
lcc не компилит с++

борланд не может скомпилить
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
using namespace std;
main()
{
    cout << "Hello, world!" << endl;
    return 0;
}
с вами разговор окончен, всего хорошего
пиши свой код

мой код работает без изменений классы туда встроить можно легко поищи кого-нибудь более продвинутого, FOLKEN добавляет ошибки а потом будет говорить это не мой код это код accepta
от тебя требовалось то прикрутить классы без изменений кода, а ты даже с этим не справился
учи стандарты а не компиляторы с conio и прочей фигнёй
0
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 26
13.12.2008, 13:49 #21
accept, дык когда был /n, то в получившемся файле после каждой неудаленной строки оставалось по три непечатных пустых прямоугольника. Убрал - и их не стало.

FOLKEN, вот в файлкопи, которая описана, у тебя в коде, всего один аргумент. Да и судя по её описанию она копирует из файла в этот же файл.
А надо, насколько я вижу по твоему коду, скопировать из tfile в ffile. Для этого же надо 2 аргумента в описании, разве не так? Да и само описание по моему должно быть несколько другое.
Фактически прога работает в точности так, как надо, только нужно чтобы писалось в тот же файл, а не создавалось еще одного.
0
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 85
13.12.2008, 19:20 #22
функция - метод класса. смотри описание
C++
1
2
3
4
5
6
void Cl::filecopy(Cl z)
{
    int c;
     while ((c = getc(z.ifp )) != EOF)
        putc(c, ifp);
}
то есть она копирует файл, переданный в аргументе, в объект, для которого она была вызвана. У нее первый аргумент и есть этот самый объект. Вощем если надо скопировать из tfile в ffile, то
C++
1
ffile.filecopy(tfile);
1
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
13.12.2008, 23:49 #23
этот участок можно заменить если компилятор не тянет ?:
C++
1
    fprintf(tfp, "%03d:%s", nl, (state == OUT ? line : "\n"));
на любой из этих
C++
1
2
3
4
    if (state == OUT)
        fprintf(tfp, "%03d:%s", nl, line);
    else
        fprintf(tfp, "%03d:\n", nl);
C++
1
2
3
4
5
    fprintf(tfp, "%03d:", nl);
    if (state == OUT)
        fprintf(tfp, "%s", line);
    else
        fprintf(tfp, "\n");
у меня когда я компилировал на борланде 90 года, вместо строк вообще всех выводился nil (ну типа 001:nil и тд), потому что борланд не понимает ?: внутри fprintf'a, хотя это соответствует стандарту 89 года

в lcc который я показывал тут, скомпилировалось всё нормально и в файл она нормально всё записала

из файла

Код
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
Код
001:a
002:
003:c
004:
005:
006:f
007:
008:
009:
010:j
011:
012:
013:
014:
015:o
016:
017:
018:
019:
020:
021:u
Добавлено через 1 час 48 минут 44 секунды
выяснил что происходит, короче bc3.1 поддерживает оператор ?:, но

C++
1
    fprintf(tfp, "%03d:%s", nl, (state == OUT ? line : "\n"));
содержит 2 аргумента после строки формата, если оставить один то всё работает (то есть нумерацию строк убрать, она будет распечатывать на выбор), то есть bc3.1 оператор знает но не тянет его так как надо

потому сработает вариант

C++
1
2
    fprintf(tfp, "%03d:", nl);
    fprintf(tfp, "%s", state == OUT ? line : "\n");
под виндой всё ок
1
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 26
14.12.2008, 04:44 #24
FOLKEN, в общем вставил я в мейн оную функцию.
Получилось так
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
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);
        }    
    }
    [U]ffile.filecopy(tfile);[/U]
    fclose(ffile.GetCl());
    fclose(tfile.GetCl());
    return 0;
}
Но в исходном файле все осталось без изменений, лишь во второй файл(куда выводится результат) после строк пишется три строки одинаковых символов.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
14.12.2008, 17:12 #25
можно переделать

tmpfile() - стандартная функция возвращает указатель на темповый поток, в который можно писать как в файл, если закрыть поток все данные из него удаляются, я искал файл этот не нашёл ни в папке программы ни в темповой директории системы, т.е. с правами всё ровно

иначе темповый файл придётся ещё удалять, а судя по вашей системе это придётся вставлять метод иначе операция удаления не будет вписываться в общий фон (работа с файлами должна осуществляться в одном классе)

если будешь делать там надо добавить метод открытия не файла функцией fopen а темпового файла функцией tmpfile()
таким образом можно будет открыть как обычный файл из одного класса, так и темповый файл из него же и работать с уже открытым потоком одинаково в обоих случаях

Добавлено через 6 часов 2 минуты 4 секунды
#define - это макроопределение, можно определять символические константы, а можно определять макросы

#define IN 1
заменит в исходнике ещё перед компиляцией его в объектник все слова IN на еденицы

#define sum(a, b) (a) + (b)
заменит в исходнике все вызовы макроса sum(2, 5) на 2+5, вычислит и оставит 7
0
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 26
14.12.2008, 18:03 #26
Я тут решил пойти нерациональным, но простым и понятным мне способом. Грубо говоря, у меня после проги, остается два файла. Первый - исходник. Второй - с результатом. Я просто еще раз открою файл с резалтом, и скопирую его содержимое построчно сначала в чаровскую переменную, потом открою исходник, и удалив его содержимое, скопирую туда содержание чаровской переменной.
Внимание вопрос - как после этого удалить файл, в котором лежали результаты?
0
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 85
14.12.2008, 18:35 #27
удалить файл можно функциями remove, DeleteFile. Заметьте, этим функциям надо передавать в качестве параметра сооответственно const char* (для _wremove - const wchar_t *) и LPCTSTR соответственно. Уж этот вопрос можно было загуглить, блин.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
15.12.2008, 01:25 #28
C++
1
2
    if (remove(fname) || rename(tname, fname))
        return 3;
но она не вписывается в общую программу и препод к этому придерётся, т.к. идёт особняком от всего кода
(удаляет исходный файл когда темповый сохранён на диске, потом темповый переименовывает в исходный)
если на папке запрещена запись прога остановится ещё на создании темпового файла на диске (короче прога будет работать не в каждой папке)
набери cacls /? там будет хелп как поменять права на rw, создай папку, туда скопируй прогу, потом права у папки оставь только r и увидишь результат
0
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 26
15.12.2008, 16:23 #29
Вопросик по синтаксису удаления.
Допустим мне надо удалить файл "2.txt", лежащий в паке проекта.
Как это будет выглядеть?
C++
1
2
fstream file;
file.open("2.txt", ios::(вот здесь что писать?));
И надо ли вообще открывать и закрывать файл, чтоб его удалить? Посмотрел по двум имеющимся самоучителям, не нашел(

И еще. Хотел скопировать из 2.тхт в 1.тхт, затем 2.тхт удалить.
Приписал к имеющимуся коду следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    fstream file;
    char*tmp=new char[];
    char a[256];
    int q=0;
    file.open("2.txt",ios::in);
    while(!file.eof())
    {file.getline(a,256,"\n");
    for(int k=0;k<(int)(strlen(a));k++)
    {tmp[q]=a[k];
    q++;}
    tmp[q]=";"; q++;}
    file.close();
 
    file.open("1.txt",ios::out);
    for(int k=0; k<i; k++)
    {if(tmp[k]==';') {file<<"\n";}
    if(tmp[k]!=';') {file<<tmp[k];}
    }
    file.close();
выводит следующие ошибки
Кликните здесь для просмотра всего текста
D:\Program Files\Microsoft Visual Studio\MyProjects\123\123.cpp(76) : error C2664: 'class istream &__thiscall istream::getline(char *,int,char)' : cannot convert parameter 3 from 'char [2]' to 'char'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
D:\Program Files\Microsoft Visual Studio\MyProjects\123\123.cpp(77) : error C2065: 'strlen' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\MyProjects\123\123.cpp(80) : error C2440: '=' : cannot convert from 'char [2]' to 'char'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
0
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 85
15.12.2008, 18:01 #30
открой msdn, там все написано
вот тут тут даже пример есть.

accept, прав, у тебя знатный винегрет получается. Юзай его темпы и не мучайсо
0
15.12.2008, 18:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2008, 18:01
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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