문제

편집 : 분명히 문제는 읽기 기능에 있습니다.

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와 같은 다른 값을 실험 할 수 있으면 컴퓨터에 바이트 레이아웃이 표시됩니다.

물론, 글쓰기에 사용 된 절차를 되돌리면서 다시 읽는 것을 신중하게 읽어야합니다. 그리고 방금 작성된 데이터를 다시 읽으려고 시도하기 전에 파일을 재배치하는 것을 잊지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top