2015-04-07 5 views
-1

Мне нужно найти строку (имя ссылки), введенную пользователем в текстовом файле. Как можно подойти к решению в C++? Должен ли я хранить контекст файла в структурах, чтобы читать данные позже? Или я могу просто открыть и прочитать файл всякий раз, когда я хочу искать информацию? Спасибо!Найти строку во входном файле - C++

Входной пример файла

111.176.4.191 www.yahoo.com 01/04/2013 
111.176.4.191 www.yahoo.com 01/09/2013 
192.168.1.101 www.yahoo.com 01/04/2013 
111.176.4.191 www.yahoo.com 01/12/2013 
192.168.1.101 www.espn.com 01/05/2013 

C++ код

#include <fstream> 
#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <string> 
using namespace std; 


//gobal variables, procedures 

void fileinfo1(string); 

char IP_Address [12]; 

char Link_Name [50]; 

char Date_Accessed [8]; 

string filename; 

int menu; 


int main() 
{ 
    // the user will input the file name here 
    cout << "Enter filename> "; 

    getline(cin, filename); 

    fstream file(filename.c_str()); 

    if (!file) 

    { 

     cout << "Invalid file.\n"; 


     return EXIT_FAILURE; 
    } 

    // the program will display the file context 
    else 
    { 
     string line; 
     int count = 10; 
     while ((count > 0) && getline(file, line)) 
     { 
      cout << line << '\n'; 
      count--; 
     } 
     file.close(); 
    } 
    return EXIT_SUCCESS; 

    // The user will be able to choose to see info about all entries or a particular one 

    cout << "Please select a menu option:"; 
    cout << "1)Link Information in date range"; 
    cout << "2)Information about all links"; 
    cout << "3)Quit the program"; 
    cin >> menu; 

    switch (menu) { 

    // see info about a particular link 
    case 1: fileinfo1(filename); 
     break; 

    case 2: 
     break; 

    case 3: 
     break; 

    default: cout << "Please a choose a number between 1 and 3"; 
     break; 

    } 

    // the file is passed to this function 
    void fileinfo1(string filename) { 

     //the user will input a link e.g www.espn.com 
     cout << "What is the link name? "; 

     cin >> Link_Name; 

     // and also input date range (start-end) 
     cout << "What is the starting date? " ; 

     cin >> Date_Accessed; 

     cout << "What is the ending date? " ; 

     cin >> Date_Accessed; 

     // Now, here's where I'm having trouble 

     // I need to find the wwww.espn.com in my file based on the range date , so that i will be able to increment the number of hits 

     unsigned int curLine = 0; 
     while (getline(filename, line)) { // I changed this, see below 
      curLine++; 
      if (line.find(search, 0) != string::npos) { 
       cout << "found: " << search << "line: " << curLine << endl; 
      } 
     } 

    } 

} 

Спасибо!

+4

что случилось с кодом, который вы опубликовали? представляется правильным способом достижения результата. – vsoftco

+0

Последние строки кода не получают правильные данные из файла. Если я буду вводить www.espn.com, он должен иметь возможность найти, если он существует в файле. Но этого не происходит. –

ответ

0

Эта часть кода не должна быть записана в вашу функцию main().

// the file is passed to this function 
void fileinfo1(string filename) { 

    //the user will input a link e.g www.espn.com 
    cout << "What is the link name? "; 

    cin >> Link_Name; 

    // and also input date range (start-end) 
    cout << "What is the starting date? " ; 

    cin >> Date_Accessed; 

    cout << "What is the ending date? " ; 

    cin >> Date_Accessed; 

    // Now, here's where I'm having trouble 

    // I need to find the wwww.espn.com in my file based on the range date , so that i will be able to increment the number of hits 

    unsigned int curLine = 0; 
    while (getline(filename, line)) { // I changed this, see below 
     curLine++; 
     if (line.find(search, 0) != string::npos) { 
      cout << "found: " << search << "line: " << curLine << endl; 
     } 
    } 

} 

и вы используете способ для многих глобальных переменных, которые действительно не нужны. И вы dident объявите строку переменных и выполните поиск. Этот shoudnt даже компилируется.

+0

Да, это была глупая ошибка. Я поставил функцию из основного. Теперь все хорошо. Просто нужно закончить чтение файла и найти нужные мне данные. –

0

Вы хотите быстрое и грязное решение или элегантный?

Для элегантного решения, я бы:

  • канавы Глобал.
  • Перед разбором прочтите весь файл в памяти.
  • Создайте внутреннюю базу данных для своих данных.
  • Напишите несколько функций запроса, которые возвращают подмножество ваших данных.

Для вашего конкретного случая вы можете использовать std :: multimap < LinkName, DateAndIP>, чтобы найти все данные, относящиеся к ссылке. DateAndIP может быть typedef для std :: multimap < Дата, IP>. Если вы никогда не использовали мультимап, это будет хороший опыт обучения. Напишите свои функции сравнения и используйте функцию-член поиска, чтобы вернуть только то, что вы ищете.

Удачи и счастливой кодировки!

+0

Я посмотрю std :: multimap. Благодарю. –

Смежные вопросы