So I'm making basic CRUD
create work fine
but when the code reach file.read(code)
VS display Read Access Violation
When I try to run each line 1 by 1 in read function there's no error until I reach file.read I'm not able to figure out the causes
I suspect the problem is in here:
Mahasiswa read(fstream &file, int pos) {
Mahasiswa result;
file.open("data.bin", ios::in | ios::binary);
file.seekp(pos * sizeof(Mahasiswa));
file.read(reinterpret_cast<char*>(&result), sizeof(Mahasiswa));
file.close();
return result;
}
This is the entire code:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
struct Mahasiswa {
int no;
int pk;
string nim;
string nama;
string jurusan;
};
void create(fstream &file, int no, int pk, string nim, string nama, string jurusan) {
file.open("data.bin", ios::app | ios::out | ios::binary);
Mahasiswa mhs;
mhs.no = no;
mhs.pk = pk;
mhs.nim = nim;
mhs.nama = nama;
mhs.jurusan = jurusan;
file.write(reinterpret_cast<char*>(&mhs), sizeof(Mahasiswa));
file.close();
}
Mahasiswa read(fstream &file, int pos) {
Mahasiswa result;
file.open("data.bin", ios::in | ios::binary);
file.seekp(pos * sizeof(Mahasiswa));
file.read(reinterpret_cast<char*>(&result), sizeof(Mahasiswa));
file.close();
return result;
}
int main()
{
fstream file;
create(file, 1, 12, "0123", "Person", "TIK");
Mahasiswa til = read(file, 0);
cout << til.nama;
}
source code from the YouTuber:
Apparently this code works:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct Mahasiswa {
int NIM;
string nama;
string jurusan;
};
Mahasiswa ambilData(int posisi, fstream& myFile) {
Mahasiswa bufferData;
myFile.seekp((posisi - 1) * sizeof(Mahasiswa));
myFile.read(reinterpret_cast<char*>(&bufferData), sizeof(Mahasiswa));
return bufferData;
}
void menulisData(Mahasiswa& data, fstream& myFile) {
myFile.write(reinterpret_cast<char*>(&data), sizeof(Mahasiswa));
}
void menulisDataByPos(int posisi, Mahasiswa& bufferData, fstream& myFile) {
myFile.seekg((posisi - 1) * sizeof(Mahasiswa));
myFile.write(reinterpret_cast<char*>(&bufferData), sizeof(Mahasiswa));
}
int main() {
fstream myFile;
myFile.open("data.bin", ios::trunc | ios::out | ios::in | ios::binary);
Mahasiswa mahasiswa1, mahasiswa2, mahasiswa3, output;
mahasiswa1.NIM = 123;
mahasiswa1.nama = "ucup";
mahasiswa1.jurusan = "memasak";
mahasiswa2.NIM = 124;
mahasiswa2.nama = "otong";
mahasiswa2.jurusan = "menjahit";
mahasiswa3.NIM = 125;
mahasiswa3.nama = "sandra";
mahasiswa3.jurusan = "mesin";
menulisData(mahasiswa1, myFile);
menulisData(mahasiswa2, myFile);
menulisData(mahasiswa3, myFile);
mahasiswa2.nama = "mario";
menulisDataByPos(2, mahasiswa2, myFile);
output = ambilData(2, myFile);
cout << output.NIM << endl;
cout << output.nama << endl;
cout << output.jurusan << endl;
myFile.close();
cin.get();
return 0;
}