ошибка чтения c ++ доступа - PullRequest
0 голосов
/ 17 мая 2018
#include<iostream>
using namespace std;
#include<conio.h>
#include<string>
#include <fstream>
#include <time.h>    


#define KB_UP 72
#define KB_DOWN 80
#define KB_LEFT 75
#define KB_RIGHT 77
#define KB_ESCAPE 27
#define KB_ENTER 13


struct kimlik {
int id;
string TC;
string Ad;
string Soyad;
bool cinsiyet;
string dogumgunu;
string tel;
string eposta;
string girist;
string cıkıst;
int depozito;
int odenmis_k[12];
double endeks[12];
double fatura[12];
int oda_no;
};
struct kimlik kisi[20];

Киси это структура ^ Я думаю, что ошибка в этой строке

void oku() {
cout << "okuma islemi yapiliyor";
ifstream file2;
file2.open("kisi.txt", ios::in |  ios::binary );
file2.seekg(0L, ios::beg);

for (int i = 0; i < 20; i++) {
int i = 0;
    cout << "suanda cursor " << file2.tellg() << endl;


    file2.read((char *)&kisi[i], sizeof(kisi[i]));


}

Я закрываю файл

file2.close();
cout << "Islem tamamlandi";
getchar();
}



int main() {

если не использовать oku (), то ошибки нет

oku();

Я использую Oku

donus:
system("cls");
int i = 1;
int KB_code = 0;

string menu[7] = { " ","Kisi ekle","Kisi sil","Kisi duzenle","Listeleme 
1","Listeme 2","Cikis" };



while ((KB_code != KB_ESCAPE) && (KB_code != KB_ENTER))
{
    system("cls");
    for (int c = 1; c <= 6; c++) {
        if (c == i)
            cout << ">> " << menu[c] << endl;
        else
            cout << "   " << menu[c] << endl;

    }

    KB_code = _getch();


    switch (KB_code)
    {
    case KB_DOWN:
        i++;
        if (i == 7)
            i = 1;
        cout << endl << i << endl;
        break;



    case KB_UP:
        i = i - 1;
        if (i == 0)
            i = 6;

        cout << endl << i << endl;
        break;

    }


}
if (KB_code == KB_ESCAPE)
    goto bitir;

switch (i)
{
case 1:
    system("cls");
    kisi_ekle();
    break;
case 2:
    cout << "case2";
    break;
case 3:
    cout << "case3";
    break;
case 4:
    system("cls");
    listeleme1();
    break;
case 5:
    cout << "case5";
    break;
default:
    goto bitir;
    break;
}
_getch();
goto donus;
bitir:
system("pause");

программа работает здесь, и я нажимаю любую клавишу, чтобы закрыть консоль, я получаю ошибку

}

Я поделился своим проектом ошибка в void oku (), потому что когда я ее не использую, ошибок нет. если я использую oku (); по завершении программы я получаю сообщение об ошибке чтения

_Pnext , 0xA3EF54

1 Ответ

0 голосов
/ 17 мая 2018

Ваш struct kimlik имеет членов типа std::string.Вы не можете просто прочитать данные из файла в struct, содержащий std::string, потому что std::string управляет их данными внутри.В зависимости от реализации std::string имеет указатель на некоторые данные и члены для размера данных и длины строки.Ваш код просто записывает в эти значения, создавая таким образом поврежденные std::string с висячими указателями и недопустимыми внутренними состояниями.Вам нужно писать и читать каждую строку независимо, используя потоковые операторы << и >>.

Лучше всего сделать ваши struct a class и создать writeToStream() и readFromStream() методы вit:

class Kimlik {
public:
    // constructor etc.

    bool readFromStream(std::istream& s) {
        // implement reading of each member here
        // return true or false depending on whether reading succeeded or not
    }

    bool writeToStream(std::ostream& s) {
        // implement writing of each member here
        // return true or false depending on whether writing succeeded or not
    }

private:
    int          id;
    std::string  TC;
    std::string  Ad;
    std::string  Soyad;
    bool         cinsiyet;
    std::string  dogumgunu;
    std::string  tel;
    std::string  eposta;
    std::string  girist;
    std::string  cıkıst;
    int          depozito;
    int          odenmis_k[12];
    double       endeks[12];
    double       fatura[12];
    int          oda_no;
};

Затем используйте те методы, где это применимо:

kisi[i].readFromStream(file2);

Также см. Как читать и записывать строку STL C ++?

...