Bitwise NOT – One’s Complement operator

मागील दोन पोस्ट मध्ये मी Bitwise AND आणी Bitwise OR operator बद्दल लिहीले होते. मी या पोस्टमध्ये Bitwise NOT operator बद्द्ल सांगते. या विषयी मी Negative Number Storing मध्ये लिहीले आहे पण त्यावेळी focus वेगळा होता. या ठिकाणी फक्त Bitwise NOT operator बद्द्ल मी लिहीत आहे.

Bitwise NOT (~) चा मात्र Negation किंवा Logical NOT (!) operator चा काही संबंध नाही. ते फक्त unary operators आहेत इतकेच. एखादा ऑपरांड असेल समजा उदा.  35 तर या नंबरचा bit wise one’s complement घ्यायचा असेल तर ~35 असे लिहावे लागेल. अर्थात हा bit wise operator असल्यामुळे तो 35 च्या प्रत्येक बीट वर काम करतो. म्हणजेच 35 चा 00100011 हा जो Binary pattern आहे त्याचे प्रत्येक bit flip करतो व resultant pattern 11011100 असा होतो. याची Decimal value  220 आहे.

परंतू तुम्ही program लिहून ~35 चे output पाहील तर मात्र ते 220 न येता -36 असे मिळेल…!

Source Code

Source Code

Output

Output

थोडक्यात म्हणजे कोणत्याही integer (n) चा complement -(n+1) असतो. अर्थात हे सर्व कळण्यासाठी तुम्ही मी या पुर्वी लिहीलेला One’s आणी Two’s complement वर लिहीलेला post refer करा. तरच तुम्हाला हा सर्व गोलमाल कळेल.

File encryption साठी याचा अनेक वेळा उपयोग केला जातो हे वरील output वरून तुम्हाला कळाले असेलच…!

File Handling – Read Mode (r)

C programming language मध्ये File access करायची असेल तर file open करायला लागते हे आपण पाहीलेच आहे. fopen हे फंक्शन कॉल करतांना या फंक्शन मध्ये दुसरे argument हे, कोणत्या मोड मध्ये file open करायची आहे हे सांगण्यासाठी असते.

Read Mode

Read Mode

File फक्त read mode मध्ये open करायची असल्यास तुम्हाला r हा option उपलब्ध करून देण्यात आला आहे. अर्थात हे single character असले तरी fopen चे दुसरे argument string असल्यामुळे तुम्हाला दुसरे argument “r” असेच लिहायला लागते. ASCII text file असेल तर “rt” असे लिहावे असे C language सांगते पण ASCII text file हा default parameter असल्यामुळे “rt” च्या ऐवजी “r” असे लिहीले तरी चालते. किंबहूना अशीच प्रथा पडली आहे. file वर कोणतीही operations करायची असल्यास fopen function कॉल करून त्या नंतरच आपल्याला read, write, modify, append इत्यादी operations करता येतात. त्या मुळे समजा आपल्याला C drive वरील myprog या sub directory मधील mydata या sub directory मधील biodata.txt हि file read करायची असेल तर…

fp = fopen(“C:\myprog\mydata\biodata.txt”, “r”);

असे statement लिहून function call करावे लागेल. n, b, a व तत्सम escape sequences मुळे operating system ला string interpret करतांना अडचण येउ नये म्हणून \ हा special escape sequence जाणीवपुर्वक वापरला आहे. दुसरा parameter हा read mode मध्ये file open करण्याची विनंती करत आहे, हि खरं तर compiler मार्फत operating system च्या API ला विनंती असते. Opening mode “r”  असतांना

  1. प्रथम file, fopen function च्या पहील्या parameter म्हणजेच address वर search करण्याचा प्रयत्न करते.
  2. जर file असेल तर ती memory वर load केली जाते.
  3. त्या नंतर file pointer लोड केलेल्या file मधील पहील्या character ला point करतो
  4. जर, file सापडली नाही अथवा read करण्यात अन्य काही अडचणी असल्या तर NULL return केला जातो.

Read mode “r” चा उपयोग file फक्त read करायची असेल तरच केला जातो. अनेक वेळा आपल्याला hard disk वर एखादी file exist आहे की नाही या साठी सुद्धा Read mode चा वापर केला जातो.

याच Read mode “r” च्या ऐवजी “r+” असा जर file opening mode दिला तर

  • File मधील Existing contents वाचता येतात
  • File मध्ये नवीन contents लिहीता येतात
  • व existing contents modify सुद्धा करता येतात

अनेक वेळा विद्यार्थी “r+” चा व “w” चा गोंधळ करून घेतात. पण “r+” ने existing contents read करता येतात व शिवाय modify सुद्धा करता येतात व या मोड मध्ये read आणी write दोनही operations existing contents वर करता येतात.

अर्थात text mode मधील file आपण open करत असल्यामुळे file accessing हे sequential असते हे लक्षात घेण्याची जरूरी आहे.

File pointer in C

C language मध्ये file handling करतांना file pointer declare करण्याची गरज असते असे मी मागील पोस्ट मध्ये सांगीतले होते. हा file pointer तयार करण्यासाठी C च्या library मध्ये FILE structure available आहे. त्याची general  definition सर्वसाधारणपणे अशी आहे.

typedef struct  {
        int             level;          /* fill/empty level of buffer */
        unsigned        flags;          /* File status flags          */
        char            fd;             /* File descriptor            */
        unsigned char   hold;           /* Ungetc char if no buffer   */
        int             bsize;          /* Buffer size                */
        unsigned char   *buffer;   /* Data transfer buffer       */
        unsigned char   *curp;     /* Current active pointer     */
        unsigned        istemp;         /* Temporary file indicator   */
        short           token;          /* Used for validity checking */
}       FILE;                           /* This is the FILE object    */

वरील Definition मध्ये फार काही समजावून घेण्याचा आटापिटा केला नाही तरी आपण जी file access करणार आहोत त्याची सर्व basic information स्टोअर करून ठेवण्याची व access करण्याची basic arrangement करून ठेवली आहे इतक तरी structure members कडे पाहील्या नंतर कळतं…! 

File pointer

File pointer

Heap वरील मेमरी ज्या प्रमाणे unnamed असते व ती मेमरी access करण्यासाठी pointer लागतो त्याच प्रमाणे हार्ड डिस्क वरील file access करण्यासाठी pointer लागतो व तो FILE structure चा करतात. हे स्ट्रक्चर typedef केले असल्यामुळे FILE असेच लिहावे लागते. file किंवा File असे लिहीले तर compile time errors मिळतील.

आता या structure चे members कसे काम करतात, file pointer आत काय काय करतो, fopen function काय काय उद्योग करते असे प्रश्न अनेक विद्यार्थी विचारतात. अशा प्रकारची curiosity चांगली असली तरी programming शिकायला सुरवात केल्या केल्या २-४ वर्षात सुद्धा या प्रश्नांची उकल होणार नाही कारण अशा प्रकारची फंक्शन्स आपण ज्यावेळी कॉल करतो त्यांना Computer Programming World मध्ये API म्हणजेच Application Programming Interface म्हणतात. Programmer चे काम इतकेच कि FILE चा pointer तयार करणे, fopen function call करणे व system कडुन आलेला pointer collect करणे. त्या पेक्षा आत जाण्याची सोय सुरक्षेच्या कारणास्तव करूनच ठेवलेली नाही….!

तर मग fopen या फंक्शनचा prototype काय आहे…?

FILE *_Cdecl fopen(const char *__path, const char *__mode);

या prototype मध्ये

  • fopen function FILE pointer return करते
  • _Cdecl हे फंक्शन calling convention आहे
  • पहीले argument string आहे जे file चा path असते
  • दुसरे argument हे file opening mode असते जे string format मध्ये द्यावे लागते.

r, w, a, r+, w+, a+, rb, wb, ab, rb+, wb+, ab+ असे अनेक file opening modes आहेत ज्याचा समाचार मी पुढील काही पोस्ट मध्ये घेते….!

तो पर्यंत…Happy Coding…!

Introduction to File handling in C

“C language झाले पण pointers आणी File handling काही कळालेले नाही”…

गेली अनेक वर्षे मी हे वाक्य engineering/diploma च्या दुसऱ्या किंवा तिसऱ्या वर्षाच्या विद्यार्थ्यांच्या कडुन ऐकून घेते. C language मधील शेवटचा चॅप्टर म्हणून सुद्धा असेल किंवा pointer कळालेला नसतो तर मग file pointer मुळे कळत नसेल किंवा अन्य कारणे असतील पण File handling च्या बाबतीत विद्यार्थी confident नसतात हे नक्की.

File Pointer

File Pointer

म्हणून मी या व पुढील काही पोस्ट मध्ये File handling बद्द्ल लिहीणार आहे. आमच्या C Marathi च्या फ्रेमवर्क मध्ये animation द्वारे हे समजावून सांगीतलेले आहेच पण तरी सुद्धा इतर काही concepts सुद्धा मी या ठिकाणी cover करते.

आपण शक्यतो जे  C चे Console applications लिहीतो त्या मध्ये file मध्ये डेटा स्टोअर करणे अथवा file मधून fetch करणे असे प्रकार नसतात. पण ज्यावेळी तुम्ही भरलेला डेटा Hard Drive वर ठेवायचा असतो अथवा Hard Disk वरील file वरून fetch करायचा असेल तर आपल्याला C language मधून file access करायला लागते.

File in C is called as “Stream of Bytes”. Stream of Bytes मध्ये Characters, Words, Lines, Paragraphs, Fields, Records असे काहीही असू शकते. C Programmer साठी File मात्र दोन प्रकारची असू शकते.

  • ASCII Text Files
  • Binary Files

या files म्हणजे काय, त्या कोणत्या प्रकारच्या असतात, त्यांच्या मध्ये फरक काय हे मी सर्व स्वतंत्र पोस्ट मध्ये सांगते. आत्ता फक्त इतकेच लक्षात घ्या की आपल्याला File handling करतांना hard disk वरील डेटा program च्या सहाय्याने RAM वर आणता येतो व तुम्ही रन करत असलेल्या application मध्ये भरलेला डेटा file वर स्टोअर करता येतो.

  1. अर्थातच हि सर्व कामे करण्यासाठी pointer ची मदत घ्यावी लागते. व त्यासाठी एक special प्रकारचा pointer लागतो त्याला आपण file pointer म्हणतो.
  2. शिवाय तुम्हाला file access करण्यासाठी ती program मधील code च्या सहाय्याने file open करावी लागते व ती open करण्याचे अनेक प्रकार आहेत ज्यांना आपण file opening modes म्हणतो.

हे सर्व file opening modes सुद्धा मी अनेक स्वतंत्र पोस्ट मध्ये घेणार आहे  जेणे करून file opening modes च्या बाबतीत विद्यार्थ्यांचा ज्या प्रमाणे नेहमी गोंधळ होतो तो होणार नाही.

File handling करतांना सर्व C च्या programs मध्ये आपल्याला file pointer लागतो. हे काम सोपं करून ठेवलय ते C मधील library मध्ये असणाऱ्या stdio.h या header file मध्ये असणाऱ्या FILE structure नं. या structure चा pointer तयार केला म्हणजे तुम्ही file access करायला मोकळे झालात. कारण हे FILE स्ट्रक्चरच मुळी magic आहे. त्याचा pointer केला की या स्ट्रक्चर मध्ये असलेल्या अनेक structure data members मुळे file access करायला सोपं जात.

ज्यावेळी तुम्ही file pointer declare करता त्यावेळी fopen या function ने return केलेला file चा address collect करणे हे महत्वाचे काम. हे एकदा पार पडले कि file pointer च्या सहाय्याने तुम्ही hard disk वरील file remotely handle करू शकता.

म्हणूनच file structure, file pointer, file opening modes, types of files हे सर्व मी या पोस्ट मध्ये न टाकता स्वतंत्र पोस्ट मध्ये टाकत जाते.

पोस्टच्या सुरवातीला विहीरीचे clip art मी का टाकले आहे ते तुम्हाला कळेलच पुढील काही पोस्ट मध्ये. नाहीतर हा व्हिडीओ पहा.

Happy Coding