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

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

Восстановить пароль Регистрация
 
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
24.11.2013, 22:35     Работа с текстовыми файлами #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
 #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(если это имеет значение)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2013, 22:35     Работа с текстовыми файлами
Посмотрите здесь:

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

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

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

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

Добавлено через 25 минут
Все разобрался с peek()... Спасибо что натолкнули на хорошую идею, что то сам не додумался посимвольно читать файл, так намного проще)
alsav22
5282 / 4801 / 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 секунд
Со скобками немного по-другому, сами додумаете.
alsav22
5282 / 4801 / 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;
}
Миниатюры
Работа с текстовыми файлами   Работа с текстовыми файлами   Работа с текстовыми файлами  

Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
25.11.2013, 16:28  [ТС]     Работа с текстовыми файлами #10
Ну мне же врать зачем?) У меня работает все, а вот если пытаюсь string-у присвоить ' '; ошибку дает, если подскажите как тут скрин кидать я скину) А так еще раз благодарю за идею, ну и ваш пост по переводу русских символов в верхний регистр тоже очень помог.
alsav22
5282 / 4801 / 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/s...ng/operator+=/
Alex_Skripa
17 / 17 / 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/s...ng/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;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 06:24     Работа с текстовыми файлами #13
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Компилируется) честно) среда VS2010...
Сказки не рассказывайте. Вот вам скрин, как этот код компилируется в 10 студии (скомпилироваться он просто не сможет). Если что-то и компилируется, то значит компилируете не этот код. Потом, я вас просил выложить кусок кода, с тем присваиванием char, который у вас выдаёт ошибку (о которой вы пишите), чтобы я мог посмотреть именно на код, а не читать ваши описания или скрины смотреть (это далеко не одно и тоже). Код в студию, который выдаёт ошибку!
Миниатюры
Работа с текстовыми файлами  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 06:36     Работа с текстовыми файлами #14
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
не знаю правильный ли я пример Вам сейчас показываю, но это как раз из той ссылки которую вы мне дали, и вот еще от туда же, тоже вроде что-то похожее
Похожее на что? Вот эту строчку видите:
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
name += '\n'; // character
К string что добавляется?
Миниатюры
Работа с текстовыми файлами  
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
26.11.2013, 16:20  [ТС]     Работа с текстовыми файлами #15
Вот компилируемый код:
Работа с текстовыми файлами
здесь я использую
C++
1
format_text+=" ";
Вы можете это увидеть.
Блин как вы пишите так тоже компилирует!
C++
1
format_text+=' ';
Но как видите
C++
1
format_text+=" ";
компилятор проглатывает и это.
Ладно благодарю за беседу разберу работу со строками как только выделится немного времени, а сейчас есть малость напряжная другая тема.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 16:24     Работа с текстовыми файлами #16
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Вот компилируемый код: Вложение 333692
здесь я использую Код C++1
format_text+=" ";
Вы простую просьбу может выполнить? Я просил не тот код, который компилируется (и не во вложении, а здесь текст выложить), а который выдаёт ошибку.
Цитата Сообщение от alsav22 Посмотреть сообщение
Код в студию, который выдаёт ошибку!
Добавлено через 1 минуту
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Блин как вы пишите так тоже компилирует!
Вот мне и интересно увидеть, как вы так интересно пишите пробел, что не компилируется.
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
26.11.2013, 16:29  [ТС]     Работа с текстовыми файлами #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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <iomanip>
#include <string>
#include <string.h>
#include <cctype>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    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()-1]!=' '))
                format_text+=" ";
            format_text+=buff;
            if (((buff=='.')||(buff==',')||(buff=='?')||(buff=='!')||(buff==')'))&&(text.peek()!=' '))
            {
                format_text+=" ";
                if ((buff!=',')&&(buff!=')'))
                {
                    text.get(buff);
                    buff=char(toupper((unsigned char)buff));
                    format_text+=buff;
                }
            }
 
        }
    }
    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;
}
Вот) Ну ладно спасибо за диалог) и хорошие подсказки...
Тему можно закрыть)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 16:31     Работа с текстовыми файлами #18
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Тему можно закрыть)
Как насчёт просьбы?
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
26.11.2013, 16:35  [ТС]     Работа с текстовыми файлами #19
Цитата Сообщение от alsav22 Посмотреть сообщение
Как насчёт просьбы?
Извините не понял? какой?

Добавлено через 2 минуты
На счет фрагмента кода? Так я вроде написал же что как написали вы тоже компилирует.
т.е
C++
1
format_text+=' ';
работает правильно...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2013, 16:53     Работа с текстовыми файлами
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
26.11.2013, 16:53     Работа с текстовыми файлами
  #20

Не по теме:

Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Извините не понял? какой?
С вами всё ясно.

Yandex
Объявления
26.11.2013, 16:53     Работа с текстовыми файлами
Ответ Создать тему
Опции темы

Текущее время: 06:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru