Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
BadBaddak
89 / 16 / 4
Регистрация: 09.06.2010
Сообщений: 100
#1

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

16.02.2011, 22:52. Просмотров 2622. Ответов 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 и сохранить в файл с символом окончания строки. В итоге должен получится текстовый файл с несколькими такими строками.
Как лучше реализовать? Создать массив, потом его сохранять в файл. Или создать файл и построчно приписывать строки в конец файла?
http://www.cyberforum.ru/cpp-beginners/thread716499.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2011, 22:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вывести середину строк (между кавычками) в файл (C++):

Вывести несколько строк в файл
Условие #include <iostream> #include <fstream> #include <iomanip> #include...

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

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

Создать текстовый файл из 5 строк, прочитать созданный файл и получить новый файл согласно своему варианту. Dev C++
8)В новом файле заменить все латинские буквы верхнего регистра на буквы нижнего...

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

11
dyosick
62 / 62 / 17
Регистрация: 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
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
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 / 4
Регистрация: 09.06.2010
Сообщений: 100
17.02.2011, 23:54  [ТС] #4
Имеется в виду, что из файла (из большого) ищутся строки, начинающиеся с [FEN " символов. Перебираю в большом цикле.
И если фенка найдена, то эти буквы (которые расположены между кавычками) нужно скинуть в файл. Строчка не задаётся в коде, а читается каждый раз из файла.
с++ не понимаю Понял, что ищутся места кавычек и между ними запускается цикл переноса по букве в файл, после чего вставляется перенос строки.
Этим "" я пытался обозначить одинарную кавычку, но попробую и \"
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
18.02.2011, 01:39 #5
C
1
    if (strstr(s, "[FEN \"") == s)
Цитата Сообщение от BadBaddak
Этим "" я пытался обозначить одинарную кавычку, но попробую и \"
а получилось два строковых литерала, которые стоят рядом и конкатенируются в один строковой литерал

Цитата Сообщение от BadBaddak
Строчка не задаётся в коде, а читается каждый раз из файла.
ты всегда можешь задать её сначала в коде, чтобы правильно выстроить дальнейшую обработку, после чего переключить её на ввод из файла
0
BadBaddak
89 / 16 / 4
Регистрация: 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
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
27.02.2011, 06:21 #7
"[FEN """ - это "[FEN " пробелы ""

Цитата Сообщение от BadBaddak
Но как теперь вместо всей строчки s напечатать то, что внутри кавычек?
вот из этих примеров что не работает ? или что непонятно ?
0
BadBaddak
89 / 16 / 4
Регистрация: 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
1863 / 1481 / 749
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
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
1863 / 1481 / 749
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
10.08.2014, 11:38 #12
убери move вот так lst.push_back(str);
0
10.08.2014, 11:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2014, 11:38
Привет! Вот еще темы с решениями:

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

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

Дан текстовый файл f. Исключить пробелы, стоящие в концах его строк. Результат поместить в файл f1
Дан текстовый файл f. Исключить пробелы, стоящие в концах его строк. Результат...

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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