정수 값 "0"을 .Bin 파일에 저장하는 방법은 무엇입니까? (C ++)
-
06-09-2019 - |
문제
편집 : 분명히 문제는 읽기 기능에 있습니다.
02 00 00 00 01 00 00 00 00 00 00 00
따라서 0은 0으로 저장되어 0으로 읽지 않습니다.
정상적인 저장소 파일 기능을 사용할 때 :
int a = 0;
file.write(reinterpret_cast<char*>(&a), sizeof(a));
0으로 저장합니다 char
버전 또는 " 0"은 분명히 저장되지 않은 (널 값이기 때문에) 내 함수를 호출 할 때 0 값을 읽을 때 (또는 바로 직전에 값을 읽습니다. 파일에서 마지막). 그렇다면 어떻게 0.bin 파일에 제로를 저장할 수 있습니까?
편집 : 다음은 읽기/쓰기 프로세스와 관련된 일부 기능입니다.
//Init program: creates a sector.bin for another program to read from.
#include<fstream>
using namespace std;
int main()
{
fstream file;
file.open("sector.bin", ios::out | ios::binary);
if(!file.is_open())
{
file.open("sector.bin", ios::out | ios::binary);
file.close();
file.open("sector.bin", ios::out | ios::binary);
if(!file.is_open())
{
return -1;
}
}
file.seekp(file.beg);
int a = 2;
int b = 1;
int c = 0;
file.write(reinterpret_cast<char*>(&a), sizeof(a));
file.write(reinterpret_cast<char*>(&b), sizeof(b));
file.write(reinterpret_cast<char*>(&c), sizeof(c));
file.close();
return 0;
}
//Read function: part of another program that intializes variables based off
//of sector.bin
void sector::Init(std::fstream& file)
{
int top_i = FileRead(file,0);
std::cout<<top_i<<std::endl;
for(int i = 0; i < top_i; i++)
{
accessLV[i] = FileRead(file,i+1);
std::cout<<accessLV[i]<<std::endl;
}
std::cin.ignore();
viral_data.add(new X1(5,5,'X'));
viral_data.add(new X1(9,9,'X'));
player.set(0,0,'O');
return;
}
//the FileRead used in init
int FileRead(std::fstream& file, int pos)
{
int data;
file.seekg(file.beg + pos);
file.read(reinterpret_cast<char*>(&data), sizeof(data));
return data;
}
또한 사용을위한 출력 sector::Init
다음과 같다:
2
1
1
내가 쓰레기통에 쓰려고했던 OUPUT는
2
1
0
따라서 0은 1으로 읽거나 쓰여지거나 기록되지 않았으며 INT는 마지막 값을 두 번 읽습니다.
해결책
파일에 "정수 값 0"을 저장한다는 의미는 확실하지 않습니다. 파일에는 정수가 아닌 바이트가 포함되어 있습니다. (int) 0-bytes의 크기를 저장해야합니까, 아니면 단 하나의 ' 0'바이트를 저장해야합니까?
추신 : 또한 문제가 귀하의 읽기 코드에있을 수 있다고 생각합니다. 육각 편집기에서 .bin 파일을 보셨습니까?
pps 귀하의 문제는 Seekg () 기능 사용에 있습니다. 바이트로 오프셋을 전달하는 대신 POS를 통과합니다. 대신 POS * sizeof (int) 여야합니다.
다른 팁
int num = 0;
write( fd, &num, sizeof( int ));
나는 당신이 무엇을하고 싶은지 잘 모르겠습니다. 나에게 당신이 제공 한 코드가 당신이 요구하는 일을하는 것 같습니다.
int main() {
std::ofstream file("/tmp/tst.out");
int a = 0;
file.write(reinterpret_cast<char*>(&a), sizeof(a));
return 0;
}
이로 인해 제로 정수의 이진 표현이 포함 된 4 바이트 크기의 파일이 발생합니다.
$ hexdump /tmp/tst.out
0000000 0000 0000
0000004
정수를 ASCII 표현으로 저장하려면 형식 스트림 출력을 사용해야합니다. <<
:
std::ofstream file("/tmp/tst.out");
int a = 0;
file << a << std::endl;
이런 식으로 당신은 얻을 수 있습니다 :
$ cat /tmp/tst.out
0
이진 파일에 어떤 형식이 포함되어야하는지 생각해야합니다. 텍스트 파일과 동일한 방식으로 수행 할 필요가 없기 때문에 텍스트 파일이 여러 번 사용되는 이유입니다.
sizeof (int) == 4 (및 char_bits == 8) 인 (32 비트) 기계를 가정하면, 기본 형식을 사용하여 현재 파일 위치에 모두 0 인 4 바이트를 저장할 수 있습니다. 작동해야한다고 생각합니다. 0x01020304와 같은 다른 값을 실험 할 수 있으면 컴퓨터에 바이트 레이아웃이 표시됩니다.
물론, 글쓰기에 사용 된 절차를 되돌리면서 다시 읽는 것을 신중하게 읽어야합니다. 그리고 방금 작성된 데이터를 다시 읽으려고 시도하기 전에 파일을 재배치하는 것을 잊지 마십시오.