Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/210: Рейтинг темы: голосов - 210, средняя оценка - 4.77
Уничтожитель печенек
281 / 209 / 49
Регистрация: 07.02.2010
Сообщений: 724
1

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

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

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

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

C++
1
2
3
4
5
do{
   cin>>m;
   s[0]+=m;
   s[0]+=" ";
}while(!m.find('"', 1));
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2011, 14:05
Ответы с готовыми решениями:

Считать из файла от определенного символа(слова) до определенного символа(слова)
Считываем текст из файла. Допустим от слова "Qwerty" до слова "Uiop". Примерно догадываюсь как это...

Как считать из файла части строк до определенного символа
Здравствуйте, форумчане. Только началось изучение си и появился вопрос: - как считать из файла...

Как считать всё до определённого символа?
есть строка по типу этой D:\1.txt нужно получять всё до точки тоесть чтобы было так txt

Как считать все символы в файле после определенного символа
Здравствуйте! Есть текстовый файл, в котором в каждой новой строке есть такая структура...

16
Заблокирован
Автор 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
Уничтожитель печенек
281 / 209 / 49
Регистрация: 07.02.2010
Сообщений: 724
23.12.2011, 15:03  [ТС] 3
А может считывать посимвольно и каждый раз проверять?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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 Мб, у пользователя терпения не хватит ждать пока по символу считаем + два прохода!:wall:

1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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
Уничтожитель печенек
281 / 209 / 49
Регистрация: 07.02.2010
Сообщений: 724
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
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
23.12.2011, 17:59 13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вот код которій способен обрабатывать текст любой длинны
Если bRead == false, то утечка памяти. Если память для строки не была выделена, то будет попытка очистки невыделенной памяти.

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


-=ЮрА=-, для Вас http://www.cplusplus.com/refer... bad_alloc/
1
Заблокирован
Автор 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:Не надо меня держать за профана, указывая на детские азы. Я всегда пишу под уровень ТС. Как бы говорил уже очерчиваем проект - определяем сроки написания и потом выкладываем экзешники, мне бы хотелось на многих здесь посмотреть как они попробуют меня за пояс заткнуть - как бы обижать тут все горазды, т.к. держитесь дружной бражкой один за всех и все за одного, я же решаю всё сам и что то вроди прихвостней мне абсолютно НЕ НАДО!
Почему на форуме нет раздела - померяемся интелектом в написании проекта!Достало уже такое отношение!!!

0
23.12.2011, 21:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2011, 21:45
Помогаю со студенческими работами здесь

Как считать 4 строки после определенного символа и записать их в виде переменных
Дан текстовый файл: 3445 jgjghjdfgk fdkdfk fglfgofo fgjfkj3434 3446 gjfgjfdj gflgfpfg

Удалить часть строки от определенного символа до определенного символа
Всем привет, есть строка 127.0.0.1(spec) (domen\admin - user) как удалить не нужные символы,...

Чтение из файла определенного символа
Привет Друзья! Нужно записать в &quot;ComboBox&quot; определенный символ, который находиться в файле на 4...

Чтение текстового файла до определённого символа
Ниже предоставлен код, не совсем понимаю как организовать поиск. Мне нужно вывести все вопросы, для...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru