C++ ifstream读取期间访问冲突写入位置
所以我在做基本的积垢 创优 但是当代码到达file.read(code) VS display读取访问冲突 当我尝试运行read函数中的每一行1乘1时,在到达file.read之前不会出现任何错误 我无法找出原因 我怀疑问题出在这里: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
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
在本例中,它将自身视为一个字符数组,并留下一些幻数作为标记,表示它是一个“短”字符串