C++ ifstream读取期间访问冲突写入位置

C++ ifstream读取期间访问冲突写入位置,c++,C++,所以我在做基本的积垢 创优 但是当代码到达file.read(code) VS display读取访问冲突 当我尝试运行read函数中的每一行1乘1时,在到达file.read之前不会出现任何错误 我无法找出原因 我怀疑问题出在这里: Mahasiswa read(fstream &file, int pos) { Mahasiswa result; file.open("data.bin", ios::in | ios::binary); f

所以我在做基本的积垢

创优

但是当代码到达file.read(code)

VS display读取访问冲突

当我尝试运行read函数中的每一行1乘1时,在到达file.read之前不会出现任何错误 我无法找出原因

我怀疑问题出在这里:

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;
}
#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;
}
#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;
}
Mahasiswa读取(fstream和文件,int-pos){
马哈西斯瓦结果;
open(“data.bin”,ios::in | ios::binary);
文件.seekp(pos*sizeof(Mahasiswa));
read(reinterpret_cast(&result),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;
}
#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;
}
#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;
}
#包括
#包括
#包括
使用名称空间std;
马哈西斯瓦结构{
国际贸易编号;
int-pk;
弦尼姆;
字符串nama;
弦朱鲁桑;
};
无效创建(fstream&file、int-no、int-pk、string-nim、string-nama、string-jurusan){
打开(“data.bin”,ios::app | ios::out | ios::binary);
马哈西斯瓦mhs;
mhs.no=否;
mhs.pk=pk;
mhs.nim=nim;
mhs.nama=纳米;
mhs.jurusan=jurusan;
write(reinterpret_cast(&mhs),sizeof(Mahasiswa));
file.close();
}
Mahasiswa读取(fstream&file,int-pos){
马哈西斯瓦结果;
open(“data.bin”,ios::in | ios::binary);
文件.seekp(pos*sizeof(Mahasiswa));
read(reinterpret_cast(&result),sizeof(Mahasiswa));
file.close();
返回结果;
}
int main()
{   
流文件;
创建(文件,1,12,“0123”,“个人”,“TIK”);
Mahasiswa til=read(文件,0);

从语言律师的角度来看,UB发生在这里:

file.write(reinterpret_cast<char*>(&mhs), sizeof(Mahasiswa));
file.write(reinterpret_cast(&mhs),sizeof(Mahasiswa));
在这里:

file.read(reinterpret_cast<char*>(&result), sizeof(Mahasiswa));
file.read(reinterpret_cast(&result),sizeof(Mahasiswa));
这里发生的事情相当于
memcpy
memcpy
相当于浅拷贝,但只能用于所谓的“POD”类型,即:

a) 平凡可构造-没有用户定义的默认构造函数

b) 普通可复制-没有用户定义的复制构造函数或运算符

c) 标准内存布局-无虚拟继承、虚拟成员、常量非静态成员等


std::string
不是聚合,也不是POD,它存储指向实际字符串数据所在的单独内存存储的指针,因此不能对其进行浅层复制并定义特殊的成员来管理。由于这些是成员,即
Mahasiswa
的子对象,
Mahasiswa
也不能以这种方式复制。Ra当
std::string
可以被记忆时的情况是当它使用时,这很难用可移植的方式预测。

我终于找到了这个问题的答案。 我只需要关闭并重新打开流

下面是我为什么这样做的解释 尽管它仍然有访问冲突错误,但至少它有预期的输出

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
    
struct pelajar {
    string NIM;
    int num;
    };

int main()
{
    fstream data;
    pelajar lopzx = {"123",1};
    data.open("data.bin", ios::binary | ios::in | ios::out);

    pelajar man;
    data.write(reinterpret_cast<char*>(&lopzx), sizeof(pelajar));
    data.close();                                                           //close data
    data.open("data.bin", ios::binary | ios::in | ios::out);                //re-open data
    data.read(reinterpret_cast<char*>(&man), sizeof(pelajar));              //then read
    std::cout << man.NIM << man.num;

    data.close();
}
给它一个这样的值:

pelajar lopzx = {"123",1};
注: 在lopzx花括号之外
lopzx.NIM=“val”
不起作用。
这个方法有可能是我不知道的缺点。

只需将字节写入文件就不能序列化<代码> STD::String 。<代码>::String 包含内存中某个字符串的指针。例如,应该考虑使用序列化库Boost。excellent@AlessandroTeruzzi有w吗没有你提到的lib可以序列化它吗?似乎你想发明你的序列化格式。这不是一项容易的任务。即使是youtuber也不能将
std::string
写入这样的文件。他们可能会将字符数组写入该文件吗?嘿,我找到了将字符串存储在结构中的源代码。包含在底部编辑中预计起飞时间section@Vaness是的,问题是允许的大小确实因编译器而异(甚至同一个编译器的不同运行时库)只有当字符串像这样初始化时才会发生,afaik.
std::string
在本例中,它将自身视为一个字符数组,并留下一些幻数作为标记,表示它是一个“短”字符串