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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 98, средняя оценка - 4.74
Zverit
Уничтожитель печенек
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
#1

Считать из файла до определенного символа - C++

23.12.2011, 14:05. Просмотров 14685. Ответов 16
Метки нет (Все метки)

Как считать из файла строку до определенного символа, например до второй кавычки: "Stroka s 12"

Пробовал так, но как-то не так получается

C++
1
2
3
4
5
do{
   cin>>m;
   s[0]+=m;
   s[0]+=" ";
}while(!m.find('"', 1));
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2011, 14:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считать из файла до определенного символа (C++):

Считать из файла от определенного символа(слова) до определенного символа(слова) - C++
Считываем текст из файла. Допустим от слова "Qwerty" до слова "Uiop". Примерно догадываюсь как это реализовать FILE *f; char s;...

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

Считать строку из файла и найти позицию заданного символа (непонятный символ в строке) - C++
Есть у меня вот такая вот строка 181x77х1 Лежит в файле. Я ее считываю и хочу найти позицию символа 'x' не получается. ...

Как скопировать подстроку из строки до определенного символа? Или удалить, начиная с этого символа - C++
Добрый вечер. Ответ искал, но не нашёл. Предположим, есть строка: ABC|DEF Надо скопировать всё до | , т.е., в приведённом...

Чтение строки до определенного символа - C++
Всем привет, столкнулся с такой вот проблемой: int main() { char text; cin.getline(text, 50); if(strlen(text) == 0) ...

Копирование строки до определенного символа - C++
Дан текстовый файл с командами типа INSERT("Ключ", Значение) \ FIND ("Ключ") \ REMOVE ("ключ") Собственно, нужно достать Ключ и значение,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
23.12.2011, 14:13 #2
ITZver, нужно считать строку найти позицию первого вхождения " потом второго " разность позиций - длинна вашей цитаты, позиция первой кавычки начала цитаты. Лично я не заморачиваюсь считываю текст из файла целиком в буффер(так же работают все быстрые редакторы, кто бы вам что ни говорил), а потом char *first = strchr(str,'"'); - нахожу подстроку с первой кавычкой а затем
char * second = str(str + (fPos = (strlen(str) - strlen(first)) + 1,'"'); нахожу подстроку со второй кавычкой sPos = strlen(str) - strlen(second);

Добавлено через 1 минуту
В принципе поиск first second можно производить и в цикле похожем на ваш
Цитата Сообщение от ITZver Посмотреть сообщение
cin>>m;
- только вот это врядли всегда будет работать, да и текст с пробелами не ввести таким образом
1
Zverit
Уничтожитель печенек
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
23.12.2011, 15:03  [ТС] #3
А может считывать посимвольно и каждый раз проверять?
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 15:10 #4
Считывайте посимвольно
C
1
2
3
4
5
6
7
cnt = 2;
do
{
    c = fgetc (pFile);
    if ( c == '"' )    --cnt;
}
while ( cnt && c != EOF )
1
-=ЮрА=-
23.12.2011, 15:21
  #5

Не по теме:

go, маханький вопрос - как потом строку цитаты записать??? Из буфера на раз, а вот тыцаньем в файл по символу мы только время исполнения увеличим + как миниму 2 прохода нужно делать будет, вы можете как хотите относиться ко мне но концептуально то что предлагаете полный ацтой особенно для файла скажем в 3-6 Мб, у пользователя терпения не хватит ждать пока по символу считаем + два прохода!

1
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 15:27 #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
как потом строку цитаты записать???
Вы вообще о чем? Ясно дело
C
1
2
3
4
5
6
7
8
9
10
i = 0;
cnt = 2;
do
{
    s[i] = fgetc (pFile);
    if ( s[i] == '"' )    --cnt;
    ++i;
}
while ( cnt && s[i-1] != EOF && i != BUFSIZ );
s[i] = '\0';
Можно еще так.
C
1
2
3
4
cnt = 2;
fgets (buf, BUFSIZ, pFile);
for ( i = 0 ; i < strlen (buf) && cnt ; ++i )
    if ( s[i] == '"') --cnt;
1
-=ЮрА=-
Заблокирован
Автор FAQ
23.12.2011, 15:50 #7
Цитата Сообщение от go Посмотреть сообщение
fgets (buf, BUFSIZ, pFile);
хорошо опишу ситацию
строка1 BUFZIZ - "-первы кавычки
строка2 BUFZIZ
строкаn " - вторые кавычки
Как будет работать алгоритм если 2 кавычки не лежат в пределах BUFSIZ - а если весь текс одна сплошная цитата, а ладно вчухал ITZver, говн*код и думаешь молодец...

Добавлено через 1 минуту
ITZver, поставь кавычки вначале своего текста и конце и посмотри на код go...
(скажем текст 3 Мб это что то около 3млн символов, а BUFSIZ 2048 - это даст возможность максимально быстрого чтения - итог КОД НЕ ОТРАБОТАЕТ как положено, потому как алогоритм поиска нулевой, и что ту палемику разводить)
0
Zverit
Уничтожитель печенек
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
23.12.2011, 15:53  [ТС] #8
Все, сделал сам.
C++
1
2
3
4
5
do{
   cin>>m;
   s[0]+=m;
   s[0]+=" ";
}while((m[m.length() - 1]) != '"');
Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
(скажем текст 3 Мб это что то около 3млн символов
Мне нужен код только для одной строки, порядка 30 символов. Поэтому сложности здесь ненужны.
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 15:59 #9
C
1
2
3
4
5
6
7
8
9
cnt = 2;
while ( !feof (pFile) && !ferror (pFile) )
{
    if ( fgets (buf, BUFSIZ, pFile) )
        for ( i = 0 ; i < strlen (buf) && cnt ; ++i )
            if ( s[i] == '"') --cnt;
    if ( !cnt )
        //  Вторые кавычки найдены
}
C
1
2
3
4
5
6
7
cnt = 2;
do
{
    c = fgetc (pFile);
    if ( c == '"' )    --cnt;
}
while ( cnt && c != EOF && !ferror (pFile) )
А теперь ваши варианты.
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.12.2011, 17:42 #10
ITZver, вот код которій способен обрабатывать текст любой длинны
Цитата Сообщение от ITZver Посмотреть сообщение
Мне нужен код только для одной строки, порядка 30 символов. Поэтому сложности здесь ненужны.
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
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    bool bRead = false;
    long length;
    long i, j, fpos, lpos;
    char * text;
    ifstream ifs("text.txt");
    if(!ifs)
        cout<<"Error jpen text.txt\n";
    else
    {
        ifs.seekg(0,ios::end);
        length = ifs.tellg();
        ifs.seekg(0,ios::beg);
        if(!(text = new char[length + 1]))
            cout<<"Allocation memory error\n";
        else
        {
            ifs.read(text,length);
            text[length] = '\0';
        }
        bRead = !ifs.bad();
        ifs.close();
        if(bRead)
        {
            cout<<"Input text :\n";
            cout<<text<<endl;
            fpos = -1;
            lpos = -1;
            cout<<"Citates in text\n";
            for(i = 0; i < length; i++)
            {
                if(text[i] == '"')
                if(fpos == -1)
                    fpos = i;
                else
                if(lpos == -1)
                    lpos = i;
                if(-1 < fpos && -1 < lpos)
                {
                    for(j = fpos; j <= lpos; j++)
                        cout<<text[j];
                    cout<<endl;
                    fpos = -1;
                    lpos = -1;
                }
            }
            delete [] text;
        }
    }
    system("pause");
    return 0;
}
1
Миниатюры
Считать из файла до определенного символа  
-=ЮрА=-
Заблокирован
Автор FAQ
23.12.2011, 17:44 #11
ITZver, вот код которій способен обрабатывать текст любой длинны
Цитата Сообщение от ITZver Посмотреть сообщение
Мне нужен код только для одной строки, порядка 30 символов. Поэтому сложности здесь ненужны.
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
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    bool bRead = false;
    long length;
    long i, j, fpos, lpos;
    char * text;
    ifstream ifs("text.txt");
    if(!ifs)
        cout<<"Error jpen text.txt\n";
    else
    {
        ifs.seekg(0,ios::end);
        length = ifs.tellg();
        ifs.seekg(0,ios::beg);
        if(!(text = new char[length + 1]))
            cout<<"Allocation memory error\n";
        else
        {
            ifs.read(text,length);
            text[length] = '\0';
        }
        bRead = !ifs.bad();
        ifs.close();
        if(bRead)
        {
            cout<<"Input text :\n";
            cout<<text<<endl;
            fpos = -1;
            lpos = -1;
            cout<<"Citates in text\n";
            for(i = 0; i < length; i++)
            {
                if(text[i] == '"')
                if(fpos == -1)
                    fpos = i;
                else
                if(lpos == -1)
                    lpos = i;
                if(-1 < fpos && -1 < lpos)
                {
                    for(j = fpos; j <= lpos; j++)
                        cout<<text[j];
                    cout<<endl;
                    fpos = -1;
                    lpos = -1;
                }
            }
            delete [] text;
        }
    }
    system("pause");
    return 0;
}
text.txt
fdsggjdfggdlf dflkg dkfgkd "jfgdjg fjgfdj nsdgfj" jfjg " jfd hdhsf" hsdfhds jgf
1
-=ЮрА=-
Заблокирован
Автор FAQ
23.12.2011, 17:48 #12
Вот скрин работы
1
Миниатюры
Считать из файла до определенного символа  
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
23.12.2011, 17:59 #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вот код которій способен обрабатывать текст любой длинны
Если bRead == false, то утечка памяти. Если память для строки не была выделена, то будет попытка очистки невыделенной памяти.

Добавлено через 3 минуты
Не говоря уже о том, что new должен бросать исключение, а не возвращать NULL, при ошибке.
1
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 18:10 #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!(text = new char[length + 1]))
А text приравнять к NULL с начало, или в этой записи нет смысла.
1
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
23.12.2011, 19:00 #15
go, грубо говоря, сущесвует две версии new (не считая placement и не различая single-object и array-object формы).
C++
1
2
void* operator new(std::size_t size);
void* operator new(std::size_t size, const std::nothrow_t&) noexcept;
Первая в случае ошибки бросает исключение bad_alloc. Если исключение не отлавливать, то оно пойдет вверх по иерархии вызовов. В конце концов программа будет тупо терминирована.
Вторая же возвращает null pointer при ошибке выделения памяти. Если так хочется проверить возвращаемое значение, то надо использовать именно ее.

Вот примерчик. Я переопределил оператор new, чтобы имитировать ошибки выделения памяти.
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
#include <iostream>
#include <new>
 
void *operator new(std::size_t size) throw (std::bad_alloc)
{
        throw std::bad_alloc();
}
 
void *operator new(std::size_t size, const std::nothrow_t &nothrow_constant) throw()
{
        return NULL;
}
 
void foo()
{
        int *ptr = NULL;
 
        if (!(ptr = new int))
                std::cerr << "foo\n";
}
 
void bar()
{
        int *ptr = NULL;
 
        if (!(ptr = new (std::nothrow) int))
                std::cerr << "bar\n";
}
 
int main()
{
        bar();
        foo();
}
Лично у меня результат такой:
Код
bar
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Так что смысла таким образом обрабатывать выполнение обычного new никакого нет. Другое дело, если бы это был nothrow new.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2011, 19:00
Привет! Вот еще темы с ответами:

Действие при вводе определенного символа - C++
Как можно сделать чтобы при вводе &quot;а&quot; в консоли выполнялся определенный скрипт? К примеру вот код: #include &lt;cstdlib&gt; #include...

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

Определение номера определенного символа в char - C++
Всем привет! Нужна помощь. Имеем такой массив символов: char alphabet = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',...

Обрезать/скопировать string до определенного символа - C++
Есть ли библиотечная функция для данных типа string, которая урезает или копирует строку до определенного символа?Типа strtok для char'ов....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.12.2011, 19:00
Ответ Создать тему
Опции темы

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