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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 98, средняя оценка - 4.74
Zverit
Уничтожитель печенек
 Аватар для Zverit
276 / 204 / 21
Регистрация: 07.02.2010
Сообщений: 723
23.12.2011, 14:05     Считать из файла до определенного символа #1
Как считать из файла строку до определенного символа, например до второй кавычки: "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++ есть функция из библиотеки string для взятия из строчки определенного символа?
C++ Считывание вещественных переменных до определенного символа
C++ Вывод части строки после определенного символа
C++ Считать из файла от определенного символа(слова) до определенного символа(слова)
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
Уничтожитель печенек
 Аватар для Zverit
276 / 204 / 21
Регистрация: 07.02.2010
Сообщений: 723
23.12.2011, 15:03  [ТС]     Считать из файла до определенного символа #3
А может считывать посимвольно и каждый раз проверять?
go
Эксперт C++
3582 / 1362 / 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++
3582 / 1362 / 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
Уничтожитель печенек
 Аватар для Zverit
276 / 204 / 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++
3582 / 1362 / 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
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.12.2011, 17:59     Считать из файла до определенного символа #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вот код которій способен обрабатывать текст любой длинны
Если bRead == false, то утечка памяти. Если память для строки не была выделена, то будет попытка очистки невыделенной памяти.

Добавлено через 3 минуты
Не говоря уже о том, что new должен бросать исключение, а не возвращать NULL, при ошибке.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 18:10     Считать из файла до определенного символа #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!(text = new char[length + 1]))
А text приравнять к NULL с начало, или в этой записи нет смысла.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 19:10     Считать из файла до определенного символа #16
fasked,
C++
1
2
3
int *p = NULL;
if ( ! (p = new int) ) 
    cout << "Error" ;
А разве такой вариант может не отработать? Хм... Наверное, нет.


-=ЮрА=-, для Вас http://www.cplusplus.com/reference/std/new/bad_alloc/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2011, 21:45     Считать из файла до определенного символа
Еще ссылки по теме:

Как обрезать строку типа wchar_t* до определенного символа? C++
C++ Обрезать/скопировать string до определенного символа
C++ Копирование строки до определенного символа

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
23.12.2011, 21:45     Считать из файла до определенного символа #17
Цитата Сообщение от fasked Посмотреть сообщение
Не говоря уже о том, что new должен бросать исключение
приведу примерчик где bad_alloc не отработает, вобщем я вернусь...!Пока нет времени тут воевать за истину

Добавлено через 42 минуты
go, fasked, компилируем этот код(особенно в кодблоксе гонит) и пробуем ввести единичку и девять ноликов, потом десять и как бы понимаем что bad_alloc не так уж хорош
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
 
//Проверяет переденное в функцию число элементов m
//если m некорректно или же память выделить не уалось
//функция извещает об этом
//еси всё ок под строки arr выделяется память и в n число строк 
int ** allocMemoryForMatrix(double m, int ** arr, int &n)
{ 
    if (m < 1 || m != (int)m || INT_MAX < m)
        cout<<"Nevernaya velichina n\n";
    else
    {
        try
        {
            if(!(arr=new int *[(n = int(m))]))
                cout<<"Nevernaya velichina n\n";
            else
                n = int(m);
        }
        catch (bad_alloc &) 
        {
            arr = NULL;
        }
    }
    return arr;
}
//В зависимости от параметра bHandInput либо вводим элементы матрицы вручную bHandInput == true
//либо читаем их из файла
int ** setMatrixElements(bool bHandInput, ifstream &ifs, int ** arr, int n, bool &bCorrect)
{
    int i, j;
    for(i = 0; i < n && bCorrect; i++)
    {
        arr[i] = new int[n];
        for(j = 0; j < n && bCorrect; j++)
        {
            if(bHandInput)
            {
                cout<<"matr["<<i + 1<<"]["<<j + 1<<"] = ";
                cin>>arr[i][j];
            }
            else
            {
                if(!ifs.eof())
                    ifs>>arr[i][j];
                else
                    bCorrect = false;
            }
        }
    }
    return arr;
}
 
//Возвращает сумму элементов побочной диагонали с началом в arr[row][col]
int getSumOfDiagonal(int row, int col, int n, int ** arr)
{
    int i,j,sum = 0;
    if(col == 0)
    {
        for(i = row; i < n; i++)
            sum += arr[i][i - 1];
    }
    else
    {
        for(j = col; j < n; j++)
            sum += arr[j - 1][j];
    }
    return sum;
}
 
int main(int argc, char * argv[])
{
    int ** matr = NULL;//Указатель на массив
    int i,j,n,max_val,cur_val;
    double m;
    bool bCorrect = true;//Флаг отвечающий за корректность ввода
    ifstream ifs;//Поток для чтения
    //argv[0] всегда содержит путь к самой программе
    if(1 < argc)
    {
        //Пробуем открыть для чтения переданный путь
        ifs.open(argv[1]);
        if(!ifs)
        {
            cout<<"Oshibka otkritia : "<<argv[1]<<"\n";
            bCorrect = false;
        }
        else
        {
            cout<<"\tChtenie dannih is faila\n";ifs>>m;
            if(ifs.eof())
                cout<<"File ne soderzhit elementov matrici ili pust\n";
            else
            {
                if(matr = allocMemoryForMatrix(m, matr, n))
                    matr = setMatrixElements(false, ifs, matr, n, bCorrect);
                if(!bCorrect)
                    cout<<"File dannih soderzhit ne vse elementi matrici\n";
                else
                    cout<<"Chtenie okoncheno...\n";
            }
            ifs.close();
        }
    }
    else
    {
        cout<<"\tRychnoi vvod\n";
        while(!matr)
        {
            cout<<"Enter n : ";cin>>m;
            matr = allocMemoryForMatrix(m, matr, n);
        }
        matr = setMatrixElements(true, ifs, matr, n, bCorrect);
    }
    if(bCorrect)
    {
        cout<<"\tVvod matrici korrekten!Otobrazhenie matrici\n";
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < n; j++)
                cout<<setw(3)<<matr[i][j]<<" ";
            cout<<"\n";
        }
        if(n == 1)
            max_val = matr[0][0];
        else
        if(n == 2)
            max_val = matr[0][0]*matr[1][1];
        else
        //полагаем max_val равной сумме элементов 1-й
        //побочной диагонали под главной
        max_val = getSumOfDiagonal(1, 0, n, matr);
        //Если n == 1 ни в один из циклов не зайдём
        for(i = 2; i < n - 1; i++)
        {
            if(max_val < (cur_val = getSumOfDiagonal(i, 0, n, matr)))
                max_val = cur_val;
        }
        //теперь пробираем диагонали выше главной
        for(j = 1; j < n - 1; j++)
        {
            if(max_val < (cur_val = getSumOfDiagonal(0, j, n, matr)))
                max_val = cur_val;
        }
        cout<<"Result : "<<max_val<<"\n";
    }
    system("pause");
    return 0;
}
PS:fasked, ну не доработал алгоритм выделения памяти, дело же было в алгоритме чтения и парсинга цитат, как бы я мог и константно текст вбить - сути алгоритма это не изменило бы
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
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;
* * * * * * * * * * * * * * * * }
* * * * * * * * * * * * }
К тому же я из этого исходил
Цитата Сообщение от ITZver Посмотреть сообщение
Поэтому сложности здесь ненужны.
. М.б для вас в асме написать для "простоты"???

Добавлено через 5 минут

Не по теме:

PS:Не надо меня держать за профана, указывая на детские азы. Я всегда пишу под уровень ТС. Как бы говорил уже очерчиваем проект - определяем сроки написания и потом выкладываем экзешники, мне бы хотелось на многих здесь посмотреть как они попробуют меня за пояс заткнуть - как бы обижать тут все горазды, т.к. держитесь дружной бражкой один за всех и все за одного, я же решаю всё сам и что то вроди прихвостней мне абсолютно НЕ НАДО!
Почему на форуме нет раздела - померяемся интелектом в написании проекта!Достало уже такое отношение!!!

Yandex
Объявления
23.12.2011, 21:45     Считать из файла до определенного символа
Ответ Создать тему
Опции темы

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