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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
BadBaddak
89 / 16 / 3
Регистрация: 09.06.2010
Сообщений: 100
#1

Вывести середину строк (между кавычками) в файл - C++

16.02.2011, 22:52. Просмотров 2410. Ответов 11
Метки нет (Все метки)

Есть файл. Из него читаю по строкам
if (strstr( s, "[FEN """)==s) ...
Как можно из каждой найденной такой строки вытянуть текст, находящийся между кавычками?
Из строчки [FEN "8/8/8/8/1Q6/1K6/8/2Nk4 w - - 0 1"] нужно выдернуть текст между кавычек 8/8/8/8/1Q6/1K6/8/2Nk4 w - - 0 1 и сохранить в файл с символом окончания строки. В итоге должен получится текстовый файл с несколькими такими строками.
Как лучше реализовать? Создать массив, потом его сохранять в файл. Или создать файл и построчно приписывать строки в конец файла?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2011, 22:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывести середину строк (между кавычками) в файл (C++):

Как записать в файл в середину текста? - C++
Вот есть у меня файл с текстом. Надо записать ещё немного текста, но в середину (я понимаю, что часть исходного текста удалится). Как...

Вывести несколько строк в файл - C++
Условие #include <iostream> #include <fstream> #include <iomanip> #include <cstring> const int N=100; std :: ifstream...

Вывести в файл n строк с нечетными номерами, символы в которых отсортированы по убыванию - C++
В качестве входных данных программа принимает путь к папке с файлом "input.txt" и число n . В той же папке создать файл "output.txt"...

Дан текстовый файл. Вывести на экран среднюю строку (две строки, если четное количество строк) - C++
Дан текстовый файл. Вывести на экран среднюю строку (две строки, если четное количество строк).

Вывести файл на экран, чтобы в каждой строке было не больше 40 символов, и количество строк было минимальным - C++
Дано файл f. Вывести этот файл на экран так что бы в каждой строчке было не больше, чем 40 символов и количество строк было минимальным.

Дано число k (< 10) и текстовый файл, содержащий более k строк. Создать новый текстовый файл, содержащий k последних строк исходного файла - C++
Дано число k (&lt; 10) и текстовый файл, содержащий более k строк. Создать новый текстовый файл, содержащий k последних строк исходного...

11
dyosick
61 / 61 / 6
Регистрация: 25.08.2008
Сообщений: 178
17.02.2011, 00:06 #2
Вроде работает, только не забудь указать правильный путь к файлу с текстом в строке:
C++
1
ifstream file("C:\\file.txt",ios::in);
А вот сам код:
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 <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
 
using namespace std;
 
int main(int argc, char *argv[])
{
   ifstream file("C:\\file.txt",ios::in);
   ofstream new_file("C:\\new_file.txt",ios::out);
   char buf[255]; //буфер для чтения строки     
   
   if(!file)
   {
        cerr<<"Sorry, file could not be opened!!!"<<endl;
        system("pause");
        exit(1);         
   } 
    
    while(!file.eof())
    {
        //чтение строки из файла              
        file.getline(buf,sizeof(buf));
        string text=buf;
        
        int begin_pos=text.find("\"");//первое вхождение кавычек
        int end_pos=text.rfind("\"");//последнее вхождение кавычек
        
        for(int i=begin_pos+1;i<end_pos;i++)
        {
            new_file<<text[i];
            cout<<text[i];
        }
        new_file<<"\n";
        cout<<endl;
    }      
 
   system("pause");
   return 0;    
}
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.02.2011, 06:57 #3
C
1
if (strstr( s, "[FEN """)==s)
а что имеется в виду ?

C
1
    if (strstr(s, "[FEN \"\"") == s)
[FEN "8/8/8/8/1Q6/1K6/8/2Nk4 w - - 0 1"]
C
1
2
3
4
5
    const char *p = "[FEN \"8/8/8/8/1Q6/1K6/8/2Nk4 w - - 0 1\"]";
    char line[100];
 
    if (sscanf(p, "%*[^\"]\"%99[^\"]", line) == 1)
        printf("ok: %s\n", line);
ещё
[FEN "8/8/8/8/1Q6/1K6/8/2Nk4 w - - 0 1"]
C
1
2
3
4
5
6
    char buf[] = "[FEN \"8/8/8/8/1Q6/1K6/8/2Nk4 w - - 0 1\"]";
    char line[100];
 
    strtok(buf, "\"");
    strncpy(line, strtok(NULL, "\""), 99);
    line[99] = '\0';
strtok() требует проверки, так как может вернуть NULL
0
BadBaddak
89 / 16 / 3
Регистрация: 09.06.2010
Сообщений: 100
17.02.2011, 23:54  [ТС] #4
Имеется в виду, что из файла (из большого) ищутся строки, начинающиеся с [FEN " символов. Перебираю в большом цикле.
И если фенка найдена, то эти буквы (которые расположены между кавычками) нужно скинуть в файл. Строчка не задаётся в коде, а читается каждый раз из файла.
с++ не понимаю Понял, что ищутся места кавычек и между ними запускается цикл переноса по букве в файл, после чего вставляется перенос строки.
Этим "" я пытался обозначить одинарную кавычку, но попробую и \"
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.02.2011, 01:39 #5
C
1
    if (strstr(s, "[FEN \"") == s)
Цитата Сообщение от BadBaddak
Этим "" я пытался обозначить одинарную кавычку, но попробую и \"
а получилось два строковых литерала, которые стоят рядом и конкатенируются в один строковой литерал

Цитата Сообщение от BadBaddak
Строчка не задаётся в коде, а читается каждый раз из файла.
ты всегда можешь задать её сначала в коде, чтобы правильно выстроить дальнейшую обработку, после чего переключить её на ввод из файла
0
BadBaddak
89 / 16 / 3
Регистрация: 09.06.2010
Сообщений: 100
26.02.2011, 17:49  [ТС] #6
Ничего не понял.
Я в коде объявил char s[50];
В строчке if (strstr( s, "[FEN """)==s)... в массив s попадает вся строка.
Научился её выводить в файл fprintf ( fout, "%d %s", pos, s ); позиция по одному прибавляется, поэтому сначала идёт цифра по порядку. Строка печатается полностью вместе с переносом.
Но как теперь вместо всей строчки s напечатать то, что внутри кавычек? Вообще не понимаю, можно по порядку?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.02.2011, 06:21 #7
"[FEN """ - это "[FEN " пробелы ""

Цитата Сообщение от BadBaddak
Но как теперь вместо всей строчки s напечатать то, что внутри кавычек?
вот из этих примеров что не работает ? или что непонятно ?
0
BadBaddak
89 / 16 / 3
Регистрация: 09.06.2010
Сообщений: 100
27.02.2011, 15:52  [ТС] #8
Непонятные команды. Пошел по циклам искать кавычки
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
//****************** вывод посимвольно из фенки
            int flag=0, k=0;
            printf ("fen = %s\n", s);
 
            for (k=0; k<50; k++){
                //printf ("k= %3d  ", k);
                //printf ("flag %d  ", flag);
                //printf ("simbol %c  \n", s[k]);
 
 
                if (s[k]=='"' && flag==0){ // если первые кавычки
                    //printf ("kavichki pervie\n");
                   flag=1;
                   continue;
                   }
 
                if (s[k]=='"' && flag==1){
                   //printf ("kavichki vtorie\n");
                   fprintf ( fout, "\n"); // конец фен строки
                   break;
                   }
 
                if (flag==1) {
                    //printf ("pishem\n");
                    fprintf ( fout, "%c", s[k] ); // вывод в файл буквы
 
                }
 
 
            }
Долго искал то, что в условии одиночный символ ставится в одиночные кавычки. А так вроде всё работает.
0
Sandir
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 37
09.08.2014, 19:19 #9
А если есть похожая проблема, но то что между кавычек неизвестной длины и надо закинуть в какое-то временное хранилище, и только потом использовать. Думал о функции read, но возникают проблемы с длиной и типом буфера. Может подкинете идею, а то не хочется создавать новую тему.
0
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
09.08.2014, 20:36 #10
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
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <utility>
 
int main()
{
    std::ifstream ifs("in.txt");
    if(ifs.is_open())
    {
        std::string str;
        std::list<std::string> lst;
        for(char c; ifs.get(c); )
        {
            if('\"' == c)
            {
                for(; ifs.get(c) && '\"' != c; str += c)
                    ;
                std::cout << str << '\n';
                lst.push_back(std::move(str));
                str.clear();
            }
        }
    }
    else
        std::cerr << "Unable to open input file\n";
    return 0;
}
0
Sandir
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 37
10.08.2014, 11:30 #11
Цитата Сообщение от igorrr37 Посмотреть сообщение
lst.push_back(std::move(str));
Говорит, move не является элементом std, хотя копипастил ваш код.
0
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
10.08.2014, 11:38 #12
убери move вот так lst.push_back(str);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2014, 11:38
Привет! Вот еще темы с ответами:

Дан файл. Надо отсортировать этот файл в порядке убывания длин его строк - C++
Помогите, плиз. Очень надо. Дан файл. Надо отсортировать этот файл в порядке убывания длин его строк. Язык С++. Вот что я написала. //...

Вывести на экран набор символов, размещенных между данными кавычками. - Pascal
Здравствуйте. нужно сдать задачи на зачет, но есть проблема: я очень плохо разбираюсь в программировании. помогите пожалуйста =) ...

Cимволы между одинарными кавычками - PHP
Есть паттерн на .NET для извлечения символов между одинарными кавычками '(?:\\'|)*' Пробовал так, но не работает: ...

Поиск текста между кавычками в строке - C#
Здравствуйте уважаемые! Извините за вопрос - но облазил форум но конкретно моего случая не нашел... Есть очень похожие но. только учусь а...


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

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

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