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

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

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

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

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

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

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

C++
1
2
3
4
5
do{
   cin>>m;
   s[0]+=m;
   s[0]+=" ";
}while(!m.find('"', 1));
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2011, 14:05     Считать из файла до определенного символа
Посмотрите здесь:
C++ Считать из файла от определенного символа(слова) до определенного символа(слова)
Считать из файла данные определенного типа и записать в массив C++
Считать строку из файла и найти позицию заданного символа (непонятный символ в строке) C++
Как скопировать подстроку из строки до определенного символа? Или удалить, начиная с этого символа C++
Чтение строки до определенного символа C++
C++ Копирование строки до определенного символа
Определение номера определенного символа в char C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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;
- только вот это врядли всегда будет работать, да и текст с пробелами не ввести таким образом
Zverit
Уничтожитель печенек
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
23.12.2011, 15:03  [ТС]     Считать из файла до определенного символа #3
А может считывать посимвольно и каждый раз проверять?
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 )
-=ЮрА=-
23.12.2011, 15:21
  #5

Не по теме:

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

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;
-=ЮрА=-
Заблокирован
Автор 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 - это даст возможность максимально быстрого чтения - итог КОД НЕ ОТРАБОТАЕТ как положено, потому как алогоритм поиска нулевой, и что ту палемику разводить)
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 символов. Поэтому сложности здесь ненужны.
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) )
А теперь ваши варианты.
-=ЮрА=-
Заблокирован
Автор 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;
}
Миниатюры
Считать из файла до определенного символа  
-=ЮрА=-
Заблокирован
Автор 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
-=ЮрА=-
Заблокирован
Автор FAQ
23.12.2011, 17:48     Считать из файла до определенного символа #12
Вот скрин работы
Миниатюры
Считать из файла до определенного символа  
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
23.12.2011, 17:59     Считать из файла до определенного символа #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вот код которій способен обрабатывать текст любой длинны
Если bRead == false, то утечка памяти. Если память для строки не была выделена, то будет попытка очистки невыделенной памяти.

Добавлено через 3 минуты
Не говоря уже о том, что new должен бросать исключение, а не возвращать NULL, при ошибке.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 18:10     Считать из файла до определенного символа #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!(text = new char[length + 1]))
А text приравнять к NULL с начало, или в этой записи нет смысла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2011, 19:00     Считать из файла до определенного символа
Еще ссылки по теме:
Действие при вводе определенного символа C++
C++ Обрезать/скопировать string до определенного символа
C++ Считывание вещественных переменных до определенного символа
C++ Вывод части строки после определенного символа
Подсчитать в тексте количество вхождений определенного символа C++

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт С++
4933 / 2513 / 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.
Yandex
Объявления
23.12.2011, 19:00     Считать из файла до определенного символа
Ответ Создать тему
Опции темы

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