2013-12-02 4 views
0

Я новичок в C++. Я хочу создать базу данных, в настоящее время я работаю над одной из первых ее функций. Я хочу, чтобы база данных вводила пользователя и извлекала его в файл (который отлично работает), а затем я хочу, чтобы он отображал сохраненные числа. Как извлечь данные? Я знаю, что в настоящее время то, что я сделал в функции displayAll, не имеет смысла, но я пробовал другие способы, но не мог найти рабочего решения. Как присоединить каждый вход к определенному индексу таблицы? Является ли способ ввода данных, которые сейчас делают для меня?Ввод таблиц из файла

Я понимаю, что текущий способ инициализации таблицы не является оптимальным, моя цель - сохранить атрибут value. Кроме того, я хочу в ближайшее время добавить функцию ученика со студенческим знаком, именем и фамилией в том же формат как числа (структура), поскольку я хочу, чтобы у него было 2 разных типа данных и они были в одной таблице с 1000 индексами.

Ниже приведен код, ответственный

struct numbertype { 
    int value; 
}; 
numbertype numbers[1000]; 


void AddNumber(){ 
     cout << "Input number" << endl; 
     cin >> numbers[1000].value; 
     ofstream numbersout; 
     numbersout.open("D:\\numbers.txt", ios::app); 
     numbersout << numbers[1000].value<<"\n"; 
     numbersout.close(); 
    } 

    void DisplayAllNumbers(){ 
      ifstream numbersout("numbers.txt"); 
      cout << "\t\tTable: numbers"; 
      cout << "value" << endl;; 
      while (numbersout >> numbers[1000].value){ 
       cout << numbers[1000].value<<endl; 
      } 
      numbersout.close(); 
     } 
+3

'числа [1000]' выходит за пределы границ – uk4321

+0

Кроме доступ к массивам вне пределов, ваш файловый код в порядке. Тем не менее, вам, вероятно, не нужен ни массив, ни структура. Для буферизации ввода-вывода можно использовать один «int»: просто установите int, сделать файл io и повторить. Более сложные таблицы могут быть сделаны почти одинаково с большим количеством переменных. – mfabel

+0

Я предлагаю вам ознакомиться с теорией базы данных или научиться использовать базу данных. –

ответ

0

Как было отмечено в комментариях, numbers[1000] недействителен. Массивы в C++ основаны на нуле, поэтому последний элемент в массиве из 1000 элементов имеет индекс 999.

Похоже, что вы можете использовать этот индекс, чтобы вывести значение в конец массива. Это не работает. Вам нужно сохранить размер в отдельном целое и сохранить это. Вам также необходимо выполнить проверку границ, чтобы убедиться, что вы не переполняете массив.

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

#include <vector> 

std::vector<numbertype> numbers; 

void AddNumber() 
{ 
    numbertype n; 
    cout << "Input number" << endl; 
    if (cin >> n.value) { 
     numbers.push_back(n); 
     ofstream numbersout("D:\\numbers.txt", ios::app); 
     if(numbersout.good()) numbersout << n.value << "\n"; 
    } 
} 

void ReadAllNumbers() 
{ 
    numbertype n; 
    ifstream numbersin("numbers.txt"); 
    if (numbersin.good()) { 
     numbers.clear(); 
     while (numbersin >> n.value) { 
      numbers.push_back(n); 
     } 
    } 
} 

void DisplayAllNumbers() 
{ 
    cout << "\t\tTable: numbers"; 
    cout << "Wartosc" << endl;; 
    for (size_t i = 0; i < numbers.size(); i++) { 
     cout << numbers[i].value << endl; 
    } 
} 
+0

Я действительно хочу, чтобы это была таблица, вы, вероятно, правы в отношении того, что векторы проще для работы, но я хочу изучить это немного сложнее, прежде чем перейти к более простому решению s. Как я могу поместить новые значения из индекса 0, а затем сделать то же самое с отображением? – user3026386

+0

Как я уже сказал, сохраните значение, представляющее размер вашей таблицы. Назовем его 'count', который инициализируется нулем. Назначьте новые значения в 'numbers [count]', а затем увеличьте его. Когда вы читаете свои значения, сбросьте 'count' и увеличьте его для каждого прочитанного значения. Такая же сделка. Напишите на 'numbers [count]'. В обоих случаях убедитесь, что вы не допустили никаких дополнительных значений, когда «count» достиг 1000. – paddy

+0

Я пошел спать, теперь я попытался реализовать ваше решение, но, к сожалению, я не смог заставить его работать. Теперь, когда я пытаюсь отобразить числа, программа начинает отображать бесконечный цикл первых двух couts в функции :(Вот как выглядит fucntion сейчас – user3026386

0

Я пошел спать, теперь я попытался реализовать ваше решение, но, к сожалению, я не смог заставить его работать. Теперь, когда я пытаюсь отобразить номера программа начинает отображать бесконечный цикл первых два couts в функции :(Это как функция выглядит сейчас -

void Addnum(){ 
    int siz = 0; 
    cout << "Type in the number" << endl; 
    cin >> number[siz].value; 
    ofstream numbersout; 
    numbersout.open("D:\\numbers.txt", ios::app); 
    numbersout << number[siz].value<<"\n"; 
    numbersout.close(); 
    siz++; 

} 


void Displaynum(){ 
    int siz = 0; 
    cout << "\t\tTable: Numbers" << endl;; 
    cout << "Value" << endl; 

    ifstream numbersout("D:\\numbers.txt"); 

    for (int i = 0; i < rozm; i++){ 
     numbersout >> numbersout[i].value; 


    } 
    numbersout.close(); 
} 
Смежные вопросы