Чтение базы данных на основе текстового файла C ++ - PullRequest
1 голос
/ 05 июля 2011

Мне нужна простая программа на C ++, которая будет открывать текстовый файл и построчно находить второй аргумент, зная сначала в списке.

Содержимое текстового файла:

1, red
2, blue
3, green
4, orange

Итак, янужна программа, которая будет идти строка за строкой, и каждая строка превращается в массив (из двух элементов), а затем сравнивает первый элемент с интерактивно введенным пользователем номером.

Так что, если пользователь вставляет 2, он идет строка за строкой, сравниваяпервый элемент строки в массиве и, если он совпадает, он печатает второй элемент в массиве (синий), а если пользовательский тип 3, он печатает зеленый ...

Я всегда работал на PHP, и это оченьлегче, чем это, так что я немного застрял с этим сейчас ...: /

Ответы [ 3 ]

5 голосов
/ 05 июля 2011

Вот, пожалуйста:

#include <iostream>
#include <fstream>
#include <map>
#include <sstream>

int main(int argc, char* argv[]) {
  if (argc != 2) {
    std::cerr << "Usage: test [inputfile]" << std::endl;
    return 1;
  }
  std::fstream stream(argv[1]);
  if (!stream.good()) {
    std::cerr << "Error: could not open file: " << argv[1] << std::endl;
    return 2;
  }
  std::string line;
  std::map<int, std::string> map;
  while (std::getline(stream, line)) {
    std::string::size_type pos = line.find(',');
    std::stringstream sstream(line.substr(0, pos));
    int index;
    sstream >> index;
    map[index] = line.substr(pos+2);
  }
  int in;
  while (std::cin >> in) {
    std::map<int, std::string>::iterator i = map.find(in);
    if (i == map.end())
      std::cerr << "index not found" << std::endl;
    else
      std::cout << i->second << std::endl;
  }
  return 0;
}
1 голос
/ 05 июля 2011

Это, вероятно, не полезно, кроме меня;Я тренируюсь, используя разбор Духа (и генерацию кармы в качестве бонуса):

#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <fstream>
#include <map>

namespace qi = ::boost::spirit::qi;
namespace karma = ::boost::spirit::karma;

typedef std::map<int, std::string> index_t;

index_t read_index(const char* filename)
{
    using boost::spirit::istream_iterator;
    using namespace qi;

    index_t result;
    std::ifstream ifs(filename);
    ifs.unsetf(std::ios::skipws);
    istream_iterator begin(ifs), end;

    if (!parse(begin, end, (int_ >> omit[lit(',') >> *char_(" \t")] >> *(char_ - eol)) % eol, result))
    {
        throw std::runtime_error("Unable to read/parse index file ");
    }

    return result; // http://en.wikipedia.org/wiki/Return_value_optimization
}

int main()
{
    index_t index = read_index("input.txt");

    using namespace karma;
    std::cout << format(('[' << int_ << ": " << *char_ << ']') % eol, index) << std::endl;

    for (int i=0; i<10; i++)
    {
        int lookup=rand()%6;
        std::cout << "Random lookup: " << lookup << ": " << index[lookup] << std::endl;
    }

    return 0;
}

О, пример вывода:

[1: red]
[2: blue]
[3: green]
[4: orange]
Random lookup: 1: red
Random lookup: 4: orange
Random lookup: 3: green
Random lookup: 1: red
Random lookup: 5: 
Random lookup: 1: red
Random lookup: 4: orange
Random lookup: 0: 
Random lookup: 3: green
Random lookup: 1: red
1 голос
/ 05 июля 2011

Q1: Как открыть текстовый файл в C ++? Q2: Как вы читаете файл построчно?

C ++ Ввод / вывод с файлами

Q3: Как превратить строку с "," в массив на основе этого разделителя?

Как разбить строку в C ++?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...