Распечатка выбранных данных из файла .txt в C ++ - PullRequest
0 голосов
/ 19 декабря 2018

Интересно, как можно распечатать выбранные данные из файла .txt.

Например, это мой input.txt файл.Следующий пример данных имеет вид [date] [error_type] [ip_address]

[Wed Oct 11 2017] [error] [127.0.0.1] -client denied.
[Thu Oct 12 2017] [alert] [127.0.0.2] -user name not found.

. Меня попросили написать фрагмент кода, который будет распечатывать error_type и ip_address из файла.Это мой код.

#include<iostream>
#include<fstream>

using namespace std;

int main (){
    ifstream in;
    in.open("input.txt");
    char ch,x;   //ch=[ , x=.
    string er;  //er=error
    int a,b,c;  //a=127,b=0,c=1
    in>>ch>>er>>ch;
    cout<<ch<<er<<ch<<ch<<a<<x<<b<<x<<b<<c<<ch;
    return 0;
}

Проблема с этим кодом в том, что он не читает правильные данные и дает только случайные числа.

Я надеюсь, что кто-нибудь одолжит мне рукуЯ только что научился кодировать за 4 месяца.Итак, мне все кажется сложным.

1 Ответ

0 голосов
/ 19 декабря 2018

Ваши переменные не инициализированы.В начале каждая переменная может содержать каждое возможное значение.В строке

in >> ch >> er >> ch;

вы снова читаете один символ, одну строку и один символ.

Первая строка вашего файла:

[Wed Oct 11 2017] [error] [127.0.0.1] -client denied.

Итак, сначала вы читаетепервый символ ch = '[ и установите курсор на следующую позицию.Далее вы читаете строку до пробела: er = "Wed".Затем вы снова читаете символ ch = 'O'

Курсор теперь указывает на

[Wed Oct 11 2017] [error] [127.0.0.1] -client denied.
      ^

Затем вы печатаете свои данные.Поскольку вы не читали переменные, вы получаете случайные числа.

Вывод

cout << ch << er << ch << ch << a << x << b << x << b << c << ch;

должен быть

OWedOOXCYCYZO

, где XY и Z - случайные целые числаи C - случайный символ.

Вместо этого вы должны прочитать всю строку и проанализировать ее (например, разбить на ']').Вы должны инициализировать и / или прочитать все ваши переменные.x, a, b, c не установлены.Невозможно сказать, какие значения они содержат.

Это возможное решение для чтения записи журнала.

#include<iostream>
#include<sstream>

using namespace std;

int main (){
    stringstream in("[Wed Oct 11 2017] [error] [127.0.0.1] -client denied.\n[Thu Oct 12 2017] [alert] [127.0.0.2] -user name not found.");
    string line;
    getline(in, line);
    int startpos = line.find('[') + 1;
    int endpos = line.find(']');
    string date(line.substr(startpos, endpos-startpos));
    cout << "Date:\t\t" << date << endl;
    startpos = line.find('[', endpos) + 1;
    endpos = line.find(']', startpos);
    string type(line.substr(startpos, endpos-startpos));
    cout << "Type:\t\t" << type << endl;
    startpos = line.find('[', endpos) + 1;
    endpos = line.find(']', startpos);
    string ip(line.substr(startpos, endpos-startpos));
    cout << "IP:\t\t" << ip << endl;
    string message(line.substr(endpos + 2));
    cout << "Message:\t" << message << endl;
    return 0;
}

Вывод

Date:       Wed Oct 11 2017
Type:       error
IP:         127.0.0.1
Message:    -client denied.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...