Friday 13 December 2013

ASCII text file and Binary File - Part I

File handling शिकतांना तुम्हाला सुरवातीला ASCII Text file आणी Binary File असे काहीतरी शब्द कानावर पडतात. व अनेक विद्यार्थ्यांना नेमका अर्थ काय तेच कळत नाही. कारण विद्यार्थ्याला तो ASCII text file वर काम करतोय कि Binary या मध्येच गोंधळ होतो. खरं तर आपण दोनही वर काम केलेले असते. C/C++/Perl/HTML या सर्व कोड मध्ये आपण text file वरच काम करतो. 


ज्या File मध्ये ASCII characters असतात ती ASCII text file अशी simple definition देता येइल. Notepad किंवा vi editor वापरून आपण जी तयार करतो त्या ASCII text files च असतात. ASCII मधील A हा American असल्यामुळे ASCII text file american-centric च आहे आणी जगभर America देशाचाच Software मध्ये प्रभाव असल्याने अर्थातच ते international standard होउन बसले आहे...!

Computer Scientist हे सर्वात जास्त महत्व कशाला देत असतील तर ते Abstraction ला. हिच philosophy वापरून खरं तर OOP methodology तयार झाली. Text editor हे abstraction चे उत्तम उदाहरण म्हणता येइल. 

Memory मग ती free memory असो अथवा hard disk असो, त्या वरील डेटा हा 0s आणी 1s मध्येच स्टोअर होतो हेच तर खरे abstraction आहे. तर मग Text file असली काय किंवा binary file असली काय, शेवटी काय फरक पडतो असा प्रश्न तुम्हाला पडेल...!

त्या साठी प्रथम file म्हणजे काय ते सांगते. C मध्ये file म्हणजे Collection of bytes stored on secondary storage device like hard disk. त्या मध्ये characters असतील, words असतील, lines असतील, paragraphs असतील अथवा Data base मधील fields आणी records असतील. किंवा Image मधील pixels असतील. 

ASCII Text Files:
  1. हि एक प्रकारची Special Binary file च असते. ASCII हा 7 byte code असलेले character असते कारण एकूण ASCII characters 128 आहेत. त्यामुळे प्रत्येक कॅरेक्टर स्टोअर होतांना त्याचा most significant bit 0 (zero) असतो व तो वापरला जात नाही. Binary file च्या बाबतीत मात्र तशी काही गैरसोय होत नाहॊ व पुर्ण 256 bit patterns वापरले जातात. 
  2. शिवाय ASCII text file हि कायम Sequential स्वरूपात access करता येते. 
  3. या प्रकारची file forward direction नेच access करता येते. 
  4. याच कारणामुळे Text file हि read mode, write mode or append mode या पैकी एकाच mode मध्ये open करता येते. 
  5. ज्यावेळी data store (write) होतो त्यावेळी Newline character in text mode is converted into the carriage return - line feed combination व तशाच प्रकारची process उलट पद्धतीने होते ज्यावेळी file (read) hard disk वरून आणली जाते. अशाच प्रकारची इतर translation सुद्धा programmer च्या अपरोक्ष (background) होत असतात.
  6. फक्त कॅरेक्टर्स handle करण्याच्या पद्धतीमुळे एकावेळी एकच कॅरेक्टर read किंवा write करता येते.    

समजा एखाद्या नोटपॅड मध्ये तुम्ही cat असा word type केला व file save केली तर hard disk वर c, a, t या प्रत्येक alphabet हे corresponding ASCII value च्या स्वरूपात स्टोअर होइल. 




Binary files:
Binary files सुद्धा collection of bytes च असते. C language मध्ये Character आणी Byte एकच represent करत असल्यामुळे Binary files सुद्धा character streams म्हणूनच ओळखल्या जातात. थोडा-फार फरक आहे तो असा कि:

  1. Write किंवा Read operation च्या वेळी डेटाचे special processing होत नाही व गरज सुद्धा नसते. 
  2. C Programmer ला bit level ला काम करता येते. 
  3. Binary files sequentially आणी Randomly प्रोसेस करता येतात. 
  4. Read आणी Write operations हि एकाच वेळी (Simultaneously) करता येतात. 

ज्यावेळी तुम्ही एखादे कॅरेक्टर टाइप केल्यानंतर save होतांना तो entire byte rules प्रमाणे स्टोअर होइल.  
Binary files बरोबर सुद्धा आपण अनेकवेळा काम करतो...उदा. executable file, object files, sound files, image files या सर्व binary files category मध्ये मोडतात. उदा.

Data base files मध्ये file तयार करणे व process करणे Binary files च्या बाबतीत सोपे असते. Record update करायची असेल तर record locate करणे, मेमरी मध्ये fetch करणे, modify करून file मध्ये हव्या त्या ठिकाणी ठेवण्याची कामे सहज शक्य असतात. अशा प्रकारच्या कामाला text file शक्यतो वापरता येत नाही. 

Text आणी Binary files मध्ये broadly फरक केला जातो तो त्यांच्या 
  • new line handle करण्याच्या पद्धतीमुळे  
  • end of line represent करण्याच्या पद्धतीमुळे 
  • number store करण्याच्या पद्धतीमुळे
याच्या पुढील पोस्ट मध्ये मी एक प्रोग्रॅम घेउन सविस्तर सांगते...

Till then Happy Coding...! 

       
            

Thursday 12 December 2013

sprintf functions in C

printfscanf हि फंक्शंन्स तुम्हाला माहीतच झाली आहेत. मागील पोस्ट मध्ये त्या दोनही फंक्शंन्स विषयी मी थोडे-फार लिहीले होते. पण सर्वच काही जाणीवपुर्वक लिहीले नाही. कारण त्या फंक्शंन्स शी निगडीत अनेक concepts असे आहेत की एकाच पोस्ट मध्ये लिहीले तर वाचायचा कंटाळा करून तुमचे दुर्लक्ष होउ शकते. 

printf व scanf या दोन फंक्शंन्सशी निगडीत अजून दोन फंक्शंन्स मी आज घेते आहे ती म्हणजे sprintf आणी sscanf. अनेकवेळा ती कशी व कधी वापरायची हे न कळाल्यामुळे शिकायची सुद्धा राहून जातात. 

Buffering Video


एकदम सोप्या भाषेत सांगायचे झाले तर printf function ज्यावेळी call करतो त्यावेळी त्याचे output आपल्याला monitor वर दिसते. पण हेच जर आपल्याला monitor वर न पाठवता एकाद्या व्हेअरेबल मध्ये स्टोअर करायचे असेल तर sprintf हे फंक्शन तुम्हाला मदत करेल. आता printf function call करतांना त्याचे पहीले argument string constant असते व त्यामधील formatted contents हे monitor वर पाठवले जात असतील तर हेच contents store करायला लागणाऱ्या व्हेअरेबल चा data type अर्थातच string असायला हवा. त्यामुळे sprintf function चा प्रोटोटाइप सुद्धा 

int sprintf ( char * buffer, const char * format [ , argument , ...] );

असा आहे. या ठिकाणी पहीले argument buffer हा character pointer म्हणजेच string आहे हे लक्षात घ्या. उर्वरीत arguments हि printf function प्रमाणे same आहेत. फरक इतकाच की output हे monitor ला पाठवायच्या ऐवजी buffer point करत असलेल्या string मध्ये स्टोअर करण्याची विनंती आपण sprintf function ला करत आहोत. त्यामुळे प्रोग्रॅम मध्ये buffer साठी एक sufficient size असलेला एक character array declare करून ठेवण्याची गरज असते. जसे की 

char buffermem[100];

व हाच base address तुम्ही sprintf function ला first argument म्हणून पाठवायचा म्हणजे काम भागले...!

समजा आपण एक छोटा प्रोग्रॅम लिहायचा प्रयत्न केला तर कसा असेल...?


व output 

              
असे असेल....

File handling करतांना अशा प्रकारच्या फंक्शंन्स चा उपयोग करता येउ शकतो. किंवा एखादे output आपल्याला नंतर वापरायचे असेल तर sprintf function चा वापर केला जातो. 

printf function ज्या प्रमाणे monitor वर किती characters print केली त्याचा integer number return करते त्याच प्रमाणे sprintf function सुद्धा किती characters array मध्ये टाकली ते return करते. अर्थात त्या मध्ये string terminating character घेत नाही हे लक्षात घ्या...!

एखादा youtube वरचा व्हिडीओ आपण direct न पहाता pause करून buffer memory मध्ये साठवून ठेवतो व नंतर internet connection नसतांना सुद्धा पाहतो तसलाच काहीतरी हा प्रकार आहे असे मला अनेक वेळा वाटते...!

पुढच्या पोस्ट मध्ये मी sscanf बद्द्ल लिहीते...

Till then Happy Coding...!    

Tuesday 10 December 2013

scanf function in C language

मागील पोस्ट मध्ये मी printf function बद्दल सांगीतले होते. त्या फंक्शनची जोडीदारीण म्हणजे scanf function. अर्थातच printf function जर output साठी वापरण्यात येत असले तर scanf हे input घेण्यासाठी वापरण्यात येते. जवळपास सर्वच program मध्ये जोडीने फीरतांना तुम्हाला हे आढळतील...!

इंग्रजी मध्ये एखाद्याचे inspection किंवा screening करायचे असेल तर scanning हा शब्द वापरला जातो. मला कधी कधी वाटतं युझरने भरलेली व keyboard च्या आत दडलेली value मेमरीमध्ये चपखलपणे नेउन ठेवण्याचे काम करणारे हे फंक्शन आहे म्हणून scanf असे नाव ठेवले आहे. गंम्मत म्हणजे Java मध्ये अशा प्रकारचे फंक्शन जरी नसले तरी Java मध्ये input घेण्यासाठी object तयार करायला लागतो व त्या object च्या class चे नाव Scanner ठेवले आहे...!

printf function व इतर अनेक फंक्शन्स प्रमाणेच input घेण्याची व्यवस्था सुद्धा डेनीसनं C language मध्ये built in केली नव्हती. त्यामुळे हे फंक्शन सुद्धा compiler च्या library मध्ये उपलब्ध आहे व stdio.h या header file मध्ये त्याचा prototype आहे. तो सर्वसाधारणपणे 

int     _Cdecl scanf(const char *__format, ...);

असा आहे. आता याच फंक्शनचे scanning करायचे म्हणले तर 

scanf function integer return करते. 
printf function प्रमाणेच याचे calling convention _Cdecl आहे. 
याचे पहीले argument स्ट्रिंग असते
पुढील argument सुद्धा printf function प्रमाणे Ellipsis म्हणजेच 3 dots (...) आहे. म्हणूनच मागील पोस्ट मध्ये सांगीतल्या प्रमाणे हे फंक्शन सुद्धा variable number of arguments म्हणजेच any number of arguments घेउ शकते.              

scanf या फंक्शन मध्ये printf function प्रमाणे पहीले argument जरी string असले तरी या स्ट्रिंग मध्ये फॉर्मॅट स्पेसीफायर काही अपवाद वगळता कोणतीही इतर कॅरेक्टर्स लिहून नयेत. त्यामुळे समजा एक इंटीजर input घ्यायचा असेल व x या व्हेअरेबल मध्ये स्टोअर करायचा असेल तर स्टेटमेंट

scanf("%d",&x); 

असे असेल. स्ट्रिंग नंतर जी arguments ची लिस्ट असते त्या मध्ये व्हेअरेबल्सची मेमरी द्यावी लागते. म्हणून व्हेअरेबल च्या नावा समोर ampersand म्हणजेच address operator जोडतात. जर व्हेअरेबल स्वत:च pointer variable असेल तर ampersand जोडण्याची गरज उरत नाही. उदा. 

int x; 
int *ptr = &x;

scanf("%d",ptr); 

असे लिहीले तर keyboard कडून input केलेली value x मध्ये स्टोअर केली जाइल. समजा आपल्याला अनेक integer, real, characters input करून घ्यायच्या आहेत तर तुम्ही 

scanf("%d%f%c",&x,&y,&ch);

असे लिहू शकता. व या format specifiers व्यतीरीक्त इतर कोणतीही characters या string च्या आत लिहू नयेत. अनेक वेळा अनवधानाने escape sequence लिहीण्याची चुक विद्यार्थ्यांच्या कडुन होते व compile अथवा run time error सुद्धा मिळत नाही पण output मात्र चूकीचे मिळते. 

मी एक छोटासा प्रोग्रॅम खाली देते आहे. पहा हवं तर टाइप आणी रन करून...

#include<stdio.h>
void main( )
{
        char line[200];
        printf("Enter Sentence\n");
        scanf("%[^\n]",line);
        printf("%s",line);
}

मी अजून एक गंम्मत सांगते पोस्ट संपवायच्या पुर्वी.... कारण तसं म्हणल ना तर printf आणी scanf वर मला खुप काही सांगायचयं तुम्हाला पण मी एकाच पोस्ट मध्ये नाही लिहीत सगळं... कारण खुप काही आहे...सांगेन मी तुम्हाला

तर printf आणी scanf यांना print function आणी scan function असे म्हणतात हे ठिक आहे पण f हा function साठी राखीव नसून formatted साठी राखीव आहे...!

C is really mysterious language... Life long... 




Wednesday 4 December 2013

printf function in C

C language मध्ये printf म्हणजेच print function ची ओळख पहील्याच दिवशी होते. डेनीस रिची ला C language हि compact form मध्येच हवी होती. म्हणून जाणीवपुर्वक त्याने input/output ची सोय language च्या definition मध्ये केलेली नाही. अर्थात printf हे फंक्शन C language चा inherent part आहे अशी अनेक जणांची सुरवातीला समजूत होते हा भाग वेगळा. 




printf function हे formatted console I/O functions या category मध्ये येते. प्रथम मी या category चा अर्थ काय आहे ते सांगते. 


  1. Console : या शब्दाचे अनेक अर्थ आहेत. English मध्ये त्याचा अर्थ सांत्वंन करणे असा आहे. तर Computer मध्ये keyboard व monitor चे combination, display monitor, command line interface, computer terminal असे अनेक आहेत. C language च्या मर्यादीत अर्थ पहायचा असेल तर शक्यतो असे application ज्या वर फक्त text based output अशी स्क्रिन. यालाच console असे शक्यतो ओळखले जाते. व printf function कॉल करून प्रिंट केलेले output console ला म्हणजेच monitor ला पाठवले जाते
  2. Formatted: Console Screen वर output नेमक्या ठिकाणी हवे असेल, दोन शब्दांमध्ये अथवा दोन वाक्यांमध्ये ठरावीक अतंर ठेवायचे असेल, किंवा real number print करतांना decimal point नंतर ठरावीक digits हवे असतील अशा प्रकारचे किंवा तत्सम प्रकारचे formatted output हवे असेल तर ते printf function च्या सहाय्याने करता येते. 
  3. I/O : Input व Output या जोडगोळीचे ते संक्षीप्त स्वरूप आहे. 


हे फंक्शन Compiler च्या library मध्ये उपलब्ध असते व त्याचा प्रोटोटाइप stdio.h या header file मध्ये असतो. तो साधारणपणे 


int     _Cdecl printf(const char *__format, ...);


असा आहे. या prototype वरून कोणती माहीती मिळते...? तर


  • printf function चा return type integer आहे
  • _Cdecl ला printf function चे calling convention म्हणतात. 
  • printf function पहीले argument string घेते
  • printf function चे दुसऱ्या argument मध्ये तीन dots दाखवले आहेत ज्याला ellipsis असे म्हणतात ज्याचा अर्थ variable number of arguments असा आहे. म्हणजेच printf function एक पेक्षा जास्त कितीही arguments घेते.

हे फंक्शन 


  • series of arguments घेते
  • जर पहील्या स्ट्रिंग मध्ये काही format specifiers असतील तर त्या प्रमाणे apply करते
  • आणी formatted data console वर print करते

printf function ची वैशिष्ठे


  • By default printf function print करतांना right hand side ला word wrap facility वापरते
  • \n हे special implementation control character आहे ज्या मध्ये control next line ला नेण्याचे काम करते
  • Screen scroll down करण्याची सुविधा सुद्धा printf function मध्ये built in आहे
  • character print केल्या नंतर cursor next position ला नेण्याचे काम सुद्धा automatically नेण्याची provision आहे
  • पहील्या format specifier ला format नंतरचे पहीले argument connect करण्याचे, दुसऱ्या format specifier ला format नंतरचे दुसरे argument connect करण्याचे व त्याच पद्धतीने पुढील format specifier apply करण्याची built in सुविधा printf function मध्ये आहे


format specifier चा typical form 

% [flags] [width] [.prec] [{h|l}] type

असा आहे. 

या मध्ये अनेक प्रकारचे flags व type आहेत. पण महत्वाचे व नेहमी लागणारे मी येथे घेते. बाकीचे स्पेशल पुढील पोस्ट मध्ये. 

int x = 55;
printf("x = %o",x); 

असे असेल तर o हा एखादा integer number जर octal format मध्ये print करायचा असेल तर वापरतात. या ठिकाणी तुम्हाला output मात्र 

x = 67 

असे येइल. पण तुम्हाला true octal representation हवे असेल तर मात्र printf function 

printf("x = %#o",x);

असे लिहावे लागेल, या ठिकाणी # हा flag आहे . 

समजा तुम्हाला x = 55 या स्टेटमेंट नंतर value print करतांना मात्र +55 अशी हवी असेल तर + flag वापरावा लागेल जसे की 

printf("x = %+d",x); 

समजा आपल्याला 55 च्या अलीकडे 4 zero हवे आहेत. तर 0 असा flag टाकावा लागेल. जसे की

printf("x = %06d",x); 

असे स्टेटमेंट लिहीले तर output 000055 असे मिळेल. 

print होतांना तुम्हाला width specify करायची असेल तर ती सुद्धा देउ शकता. जसे की 

printf("x = %d",x); असे लिहीले तर output 

x = 55 

असे मिळेल. पण समजा

printf("x = 10d",x);

असे लिहीले तर 10 columns जागा राखीव ठेवून मग त्या ठिकाणापासून डाव्या बाजूला printing होइल जसे कि

x =           55

असे होइल. 

समजा 

float y = 6.7;

असे स्टेटमेंट असेल तर 

printf("y = %f",y); 

हे स्टेट्मेंट printing करतांना 

y = 6.700000 

असे करेल. पण जर 

printf("%0.2f",y);

असे लिहीले तर मात्र output

y = 6.70 

असे मिळेल.   
  
C language मध्ये असलेल्या वेगवेगळ्या format specifiers ची माहीती मी या पुर्वीच Blog वर टाकली आहेत


  
   

   

Do you like the C Marathi e-learning concept?