سؤال

تحرير: على ما يبدو، المشكلة في وظيفة القراءة: لقد راجعت البيانات في محرر سداسي عشري

02 00 00 00 01 00 00 00 00 00 00 00

لذلك يتم تخزين الصفر كما صفر، فقط لا تقرأ كما صفر.

لأنه عندما أستخدم وظيفة ملف المتجر في BIN العادي:

int a = 0;
file.write(reinterpret_cast<char*>(&a), sizeof(a));

يخزنها 0 كما char الإصدار، أو " 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

لذلك يتم قراءة / مكتوبة واحدة إما ك 1، أو عدم المكتوبة والبدرة تقرأ القيمة الأخيرة مرتين.

هل كانت مفيدة؟

المحلول

ليس من الواضح ما تقصده "تخزين القيمة الصحيحة 0" في ملف. تحتوي الملفات على بايت، وليس الأعداد الصحيحة. هل تحتاج إلى تخزين Sizeof (int) 0 بايت، أو بايت واحد فقط من بايت واحد؟

PS أنا أيضا أعتقد أن المشكلة قد تكون في رمز القراءة الخاص بك. هل نظرت إلى ملف .bin الخاص بك في محرر هيكس؟

PPS. مشكلتك في حالة البحث () استخدام الدالة. بدلا من اجتياز الإزاحة في بايت، يمكنك تمرير نقاط البيع. يجب أن يكون 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;
}

ينتج عن هذا في ملف من أربعة بحجم بايت يحتوي على التمثيل الثنائي لعدد صحيح صفر:

$ 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

تحتاج إلى التفكير في أن تنسيق الملف الثنائي يجب أن يحتوي - شيء لا يتعين عليك القيام به بنفس الطريقة مع الملفات النصية، وهذا هو السبب في عدة مرات يتم استخدام ملف نصي.

على افتراض آلة (32 بت) حيث الحجم (int) == 4 (و char_bits == 8)، ثم يمكنك تخزين 4 بايت كلها صفر في موقع الملف الحالي باستخدام تنسيق أصلية، ثم ما وصلت إليه هناك يجب أن تعمل، على ما أعتقد. يمكنك تجربة القيم الأخرى مثل 0x01020304، سترى تخطيط البايت على جهازك.

بالطبع، عليك أن تكون حذرا قراءتها مرة أخرى، وعكس الإجراء المستخدم للكتابة. ولا تنس تحديد الملف قبل محاولة إعادة قراءة البيانات مكتوبة فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top