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

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

Войти
Регистрация
Восстановить пароль
 
 
Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
#1

Работа с текстовыми файлами - C++

24.11.2013, 22:35. Просмотров 853. Ответов 19
Метки нет (Все метки)

Люди добрые кто может подскажите))
Задание: Дан текстовый файл, проставить пробелы после знаков препинания ",.?!" если он отсутствует, поставить пробел перед ( и после ) если он отсутствует. Есть небольшие наработки, застрял на том: что не знаю как в текстовом файле заменить слово (могу записать в конец или на место курсора, но вот как заменить слово разобраться не могу)...
Пример:
Дано:Вася Петя,номер завтра(поможем) когда.вот
Получим: Вася Петя, номер завтра (поможем) когда. Вот
Помогите пожалуйста очень срочно нужно. Вот пока то что накидал:
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
 #include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <Windows.h>
#include <iomanip>
 
using namespace std;
 
 
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    fstream text;
    int p;
    string str1;
    char *str2;
    text.open("text.txt");
    if (text)
    {
        while (!text.eof())
        {
            text >>str1;
            p = int(strpbrk(str1.c_str(),",.!?"));
            if ((strpbrk(str1.c_str(),",.!?")!=NULL)&&(str1[int(strpbrk(str1.c_str(),",.!?"))+1]!=char(" ")))
            {
                str2 = new char [int(strpbrk(str1.c_str(),",.!?"))];  
                strncpy(str2,str1.c_str(),int(strpbrk(str1.c_str(),",.!?")));
                text << str2;
            }
        }
    }
    system("pause");
    return 0;
}
Среда Visual Studio 2010(если это имеет значение)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2013, 22:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с текстовыми файлами (C++):

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

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

Работа с текстовыми файлами - C++
Добрый вечер. Дан текстовый файл. Найти количество строк, которые начинаются с данной буквы.

Работа с текстовыми файлами - C++
Во входной файл подается текст вида: aaabcbbffff В исходной файле получается: 3аbc2b4f простейшая компоновка получается. #include...

Работа с текстовыми файлами - C++
Функция копирует с одного файла в другой, не подскажите как улучшить ее? И есть недостаток нужно подсчитывать количество элементов в файле...

Работа с текстовыми файлами в С++ - C++
Здравствуйте. На лето задали написать прогу в среде visual studio c++, но этот предмет у меня закончился зимой и я конечно уже забыл...

19
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2013, 23:19 #2
Слова в файл проблематично вставлять. Поэтому лучше считать файл, обработать, переписать файл.
1
Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
24.11.2013, 23:24  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Слова в файл проблематично вставлять. Поэтому лучше считать файл, обработать, переписать файл.
Спасибо! Так и думал,уже работаю над этим)...
А не подскажете какой тип данных можно использовать чтобы записать не известное количество слов. Я просто делал так: Читал весь файл, считал сколько слов, выделял динамический массив. (но по моему это как то не очень) можно ли записать все слова не зная сколько их во что нибудь типа массива?
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2013, 23:28 #4
vector <string>.
1
Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
24.11.2013, 23:42  [ТС] #5
Благодарю) Блин вот в Универе препод сама ничерта не знает и помоч не может, а требует чтобы решили)(+ приходится разбираться и узнаешь больше)Еще раз спасибо, буду реализовывать...

Добавлено через 10 минут
А не могли бы еще подсказать пожалуйста)
C++
1
int(strpbrk(str1.c_str(),",.!?"))
вот функция возвращает указатель на первое вхождение символа .,! итд, правильно ли я делаю чтобы узнать номер этого символа? или есть ли какая нибудь функция для этого?(много перелопатил уже, все функции возвращают указатель)
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 00:03 #6
В классе string есть свои методы, в том числе и поиска (find()). Лучше их используйте, раз читаете в string.

Добавлено через 15 минут
Я бы тут проще всё сдела. Просто посимвольно читать, например, в string, и обрабатывать. Для просмотра следующего символа в файле использовать peek(). Считали знак пунктуации, посмотрели следующий символ, если не пробел, то добавили в строку пробел. Считали скобку, посмотрели, что в строке перед этим было считано, если не пробел - добавили пробел. Как-то так...
1
Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
25.11.2013, 00:33  [ТС] #7
Цитата Сообщение от alsav22 Посмотреть сообщение
В классе string есть свои методы, в том числе и поиска (find()). Лучше их используйте, раз читаете в string.

Добавлено через 15 минут
Я бы тут проще всё сдела. Просто посимвольно читать, например, в string, и обрабатывать. Для просмотра следующего символа в файле использовать peek(). Считали знак пунктуации, посмотрели следующий символ, если не пробел, то добавили в строку пробел. Считали скобку, посмотрели, что в строке перед этим было считано, если не пробел - добавили пробел. Как-то так...
Попробую) Спасибо большое!!!

Добавлено через 25 минут
Все разобрался с peek()... Спасибо что натолкнули на хорошую идею, что то сам не додумался посимвольно читать файл, так намного проще)
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 00:55 #8
Обработка заданных знаков пунктуации, как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char ch;
 string str;
 while (true)
 {
     fin >> ch;
     if (fin.eof()) break;
     if ((ch == '.' || ch == ',' || ch == '!' || ch == '?') && fin.peek() != ' ')
     {
         str.push_back(ch);
         str.push_back(' ');
     }
     else str.push_back(ch);
 }
Добавлено через 58 секунд
Со скобками немного по-другому, сами додумаете.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 16:12 #9
Цитата Сообщение от Alex_Skripa
вы ошибаетесь) или у меня компилятор ошибается) но для переменных типа char =' '; а для string=" ";
Два компилятора:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
 
int main()
{
     string str = "";
     str += 'a';
 
     cout << str << endl;
 
     system("pause");
     return 0;
}
0
Миниатюры
Работа с текстовыми файлами   Работа с текстовыми файлами   Работа с текстовыми файлами  

Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
25.11.2013, 16:28  [ТС] #10
Ну мне же врать зачем?) У меня работает все, а вот если пытаюсь string-у присвоить ' '; ошибку дает, если подскажите как тут скрин кидать я скину) А так еще раз благодарю за идею, ну и ваш пост по переводу русских символов в верхний регистр тоже очень помог.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 18:40 #11
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Ну мне же врать зачем?) У меня работает все, а вот если пытаюсь string-у присвоить ' ';
А мне зачем? Специально скрины сделал, для подтверждения. Кусок кода с таким присвоением выложите, я посмотрю, что и как вы присваиваете.

Добавлено через 6 минут
Среда какая?

Добавлено через 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
#include <iomanip>
#include <string>
#include <string.h>
 
using namespace std;
 
 
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    fstream text;
    char buff;
    string format_text;
    format_text="";
    text.open("C:\\text.txt");
    if (text)
    {
        while (!text.eof())
        {
            text.get(buff);
            if ((buff=='(')&&(format_text[format_text.length()]!=' '))
                format_text+=" ";
            format_text+=buff;
            if (((buff=='.')||(buff==',')||(buff=='?')||(buff=='!')||(buff==')'))&&(text.peek()!=' '))
                format_text+=" ";
 
        }
    }
    else cout <<"Ошибка открытия файла!!/n";
    text.close();
    text.open("C:\\text.txt",ios::out);
    if(text)
    {
    text <<format_text;
    text.close();
    }
    else cout <<("/nВозможно у вас нет прав доступа!!");
    system("pause");
    return 0;
}
Добавлено через 10 минут
Тут может почитать про operator+= для string: http://www.cplusplus.com/reference/string/string/operator+=/
0
Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
25.11.2013, 20:19  [ТС] #12
Цитата Сообщение от alsav22 Посмотреть сообщение
А мне зачем? Специально скрины сделал, для подтверждения. Кусок кода с таким присвоением выложите, я посмотрю, что и как вы присваиваете.

Добавлено через 6 минут
Среда какая?

Добавлено через 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
#include <iomanip>
#include <string>
#include <string.h>
 
using namespace std;
 
 
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    fstream text;
    char buff;
    string format_text;
    format_text="";
    text.open("C:\\text.txt");
    if (text)
    {
        while (!text.eof())
        {
            text.get(buff);
            if ((buff=='(')&&(format_text[format_text.length()]!=' '))
                [COLOR="Red"]format_text+=" ";[/COLOR]
            format_text+=buff;
            if (((buff=='.')||(buff==',')||(buff=='?')||(buff=='!')||(buff==')'))&&(text.peek()!=' '))
               [COLOR="Red"] format_text+=" ";[/COLOR]
 
        }
    }
    else cout <<"Ошибка открытия файла!!/n";
    text.close();
    text.open("C:\\text.txt",ios::out);
    if(text)
    {
    text <<format_text;
    text.close();
    }
    else cout <<("/nВозможно у вас нет прав доступа!!");
    system("pause");
    return 0;
}
Добавлено через 10 минут
Тут может почитать про operator+= для string: http://www.cplusplus.com/reference/string/string/operator+=/
Компилируется) честно) среда VS2010... Вот что хотите думайте. Выделил присваивания в которых если я бы писал ' ' мой компилятор выдаёт ошибку. И групаш которому я эту прогу писал без проблем сразу откомпилировал. Я как бы не говорю что вы говорите не правду, но факт у меня все работает именно так как написано в этом коде, а когда писал так как говорите Вы не работало. В чем здесь соль я не знаю и если честно про работу оператора += для string не читал, я учусь методом "проб и ошибок". И вообще мне с Вами спорить понту я в программирование новичок, а у вас познания вроде как отличные, я просто сказал как есть, думал может Вы ошиблись, у всех как говорится бывает). Я обязательно почитаю про += для string, но факт все работает.

Добавлено через 3 минуты
C++
1
string& operator+= (const string& str);
не знаю правильный ли я пример Вам сейчас показываю, но это как раз из той ссылки которую вы мне дали, и вот еще от туда же, тоже вроде что-то похожее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// string::operator+=
#include <iostream>
#include <string>
 
int main ()
{
  std::string name ("John");
  std::string family ("Smith");
  [COLOR="Red"]name += " K. ";[/COLOR]         // c-string
  name += family;         // string
  name += '\n';           // character
 
  std::cout << name;
  return 0;
}
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 06:24 #13
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Компилируется) честно) среда VS2010...
Сказки не рассказывайте. Вот вам скрин, как этот код компилируется в 10 студии (скомпилироваться он просто не сможет). Если что-то и компилируется, то значит компилируете не этот код. Потом, я вас просил выложить кусок кода, с тем присваиванием char, который у вас выдаёт ошибку (о которой вы пишите), чтобы я мог посмотреть именно на код, а не читать ваши описания или скрины смотреть (это далеко не одно и тоже). Код в студию, который выдаёт ошибку!
0
Миниатюры
Работа с текстовыми файлами  
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 06:36 #14
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
не знаю правильный ли я пример Вам сейчас показываю, но это как раз из той ссылки которую вы мне дали, и вот еще от туда же, тоже вроде что-то похожее
Похожее на что? Вот эту строчку видите:
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
name += '\n'; // character
К string что добавляется?
0
Миниатюры
Работа с текстовыми файлами  
Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
26.11.2013, 16:20  [ТС] #15
Вот компилируемый код:
Работа с текстовыми файлами
здесь я использую
C++
1
format_text+=" ";
Вы можете это увидеть.
Блин как вы пишите так тоже компилирует!
C++
1
format_text+=' ';
Но как видите
C++
1
format_text+=" ";
компилятор проглатывает и это.
Ладно благодарю за беседу разберу работу со строками как только выделится немного времени, а сейчас есть малость напряжная другая тема.
0
26.11.2013, 16:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2013, 16:20
Привет! Вот еще темы с ответами:

Работа с текстовыми файлами - C++
Помоготи , пожалуйста : Создать текстовый файл и выполнить обработку текста в файле ... Пример : 2) Создать текстовый файл,...

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

Работа с текстовыми файлами - C++
Делаю лабы по С++. Необходимо записать несколько строк в файл, а затем считать их оттуда. Использую методы, описанные в методичке (по сути,...

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


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

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

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