كيفية قراءة ملف بت بت وما نوع المتغير الذي اضع فيه قيمة البت :s
كيفية قراءة بت
سلام عليكم
المعالج و الذاكرة تتعامل مع byte مباشرة. لذلك تبادل البيانات بما فيه القرأة من ملف لا يستطيع التعامل مباشرة مع bit. لازم تقراءbyte ثم باستخدام mask operators تستطيع معرفة bit.
أخوي إقرأها بايت بايت عن طريق char وبعدين تعامل معها bit bit
هذه أسهل وأبسط طريقة لكنها ليست أفضل طريقة
الاخ الكريم b.m.s
اقتباسهذه أسهل وأبسط طريقة لكنها ليست أفضل طريق
ممكن اسم افضل طريقة
و شكراً
أفضل طريقة ليست في التعامل مع الملف جملة واحدة لكن في التعامل مع أصغر معلومة و هي البت.
أول شيئ هي كيف تتم تسجيل البيانات في الملف, و أقصد بها alighnement هل على 8bits أم 16 أم 32. لأن هذه القيم هي عرض البيانات الوحيدة المتوفرة في المعالج. ; alignement سيحدد حجم الملف بالبايت هل هو من مضاعفات 8 أم 16 أم 32.
أصغرها هي 8bits وليس البت. يعني مستحيل تجل ملف مثلا حجمه هو 5bits أو ليس من مضاعفات 8bits.
فكيف ستقوم بقراءة البيانات بت وراء بت؟ هنا نقوم بمعرفة أول شيء و هي alignements. تقرأ بعدها البيانات وفق عرض align في سجلات المعالج المناسبه لها , ونبدأ بمعالجة البيانات بواسطة shift او BitMask بواسطة معاملات Bitwise ك Or و and و shl و shr و Xor و غيرها... منها ما هو متوفر فقط في assembly language و لن تجدها في لغة C او أية لغة عالية.
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
يسلمو جزاكم الله خير
ولكن تمنيت ان تكون الجابات مدهمة بمثال أو حتى بجملة برمجة
وعلى العموم مشكورين :lol:
عذراً على التأخير
للقراءة من الملف توجد ثلاثة إحتمالات :-
1) أن تقرأ من الملف بايت بايت :- وهذه الطريقة تعتبر أسهل طريقة لأنها تخلصك من مشكل كثيرة مثل كم متوسط حجم الملفات اللي بتتعامل معها البرنامج فحتى لو كان الملف حجمه 1 Gb أو حجمه 1 b سيظل نظرتك لهم واحدة - وهذا خطأ - وهذه الطريقة تعتبر سيئة إذا كان حجم الملفات أكبر من واحد ميقا تقريبا
2) قراءة الملف كاملاً مرة واحدة :- وهذه الطريقة سريعة جداً لكنها ستدخلك في متاهات كثيرة مثل متوسط حجم الملفات , هل أستطيع تحميل الملف بالكامل إلى الذاكرة و ..... إلخ لكنها تبقى الأسرع إذا كان حجم الملفات صغيراً أو متوسط ويمكن تحميله إلى الذاكرة بدون التأثير سرعة الجهاز .
3) هو أن تحجز لك buffer ( مصفوفة من البايتات ) وتقوم بتعبأته من الملف وتتوقف في حالتين :-
1) إما أن يصادفك End of Line أو End of File
2) أو أن يمتلأ الbuffer
طبعاً فيه دراسات حول أفضل حجم لل buffer وكانت بالضبط تتراوح ما بين 1024بايت إلى 4096 بايت والله أعلم لاأذكر الحجم بالضبط ومن أراد الإستزادة فعليه
بكتاب Advanced Programming in the UNIX® Environment
وهذه تعتبر أفضل طريقة لأنها تجمع ما بين السرعة والذاكرة بحيث لا يطغى جزء على أخر .
وما أراد التجريب فليجرب ملف حجمه 1 ميقا ويقراه بالثلاث طرق ويسجل الوقت ويحاول يكبر الحجم ويعيد التجربة ويرى الأفضل .
تم تعديل هذه المشاركة بواسطة b.m.s في 13 أغسطس 2006 في 21:43
ولا تزعل أخ على :) >>
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
ifstream file("test.txt");
char a;
int bit=1; // mask to read the first bit > 0x0000 0001
file >> a;
for (int i=0; i<8; i++)
cout << (bit & (a>>i)); // shift a to the right i positions and read the first bit
cout << endl;
}إعمل ملف إسمه test.txt و إكتب فيه أى حرف و شغل البرنامج حيطلعلك ال ascii بتاعه.
احساسي يقول انك تحتاج هذا الموضوع في مرحلة فك الضغط , قابلتني في طريقة Huffman , والطريقة الافضل من وجهة نظري كما قال الاخ b.m.s الطريقة الثالثة
اقتباسوهذه تعتبر أفضل طريقة لأنها تجمع ما بين السرعة والذاكرة بحيث لا يطغى جزء على أخر .
موضوع رائع والله
هذا الموضوع مغلق.
