2009-09-09 9 views
26

मेरे कार्यक्रम में, मैं अपनी इच्छित फाइलों को स्टेट करता हूं और डेटा भेजता हूं।off_t, nlink_t, size_t और अन्य विशेष प्रकारों को प्रदर्शित करने के लिए printf का उपयोग कैसे करें?

struct stat { 
    dev_t  st_dev;  /* ID of device containing file */ 
    ino_t  st_ino;  /* inode number */ 
    mode_t st_mode; /* protection */ 
    nlink_t st_nlink; /* number of hard links */ 
    uid_t  st_uid;  /* user ID of owner */ 
    gid_t  st_gid;  /* group ID of owner */ 
    dev_t  st_rdev; /* device ID (if special file) */ 
    off_t  st_size; /* total size, in bytes */ 
    blksize_t st_blksize; /* blocksize for file system I/O */ 
    blkcnt_t st_blocks; /* number of 512B blocks allocated */ 
    time_t st_atime; /* time of last access */ 
    time_t st_mtime; /* time of last modification */ 
    time_t st_ctime; /* time of last status change */ 
}; 

मेरे सवाल के लिए प्रासंगिक कोड इस प्रकार है::

len = snprintf(statbuf, STAT_BUFFER_SIZE, 
    "%crwxrwxrwx %lu %u %u %lld %s %s\r\n", 
    S_ISDIR(filestats.st_mode) ? 'd' : '-', 
    (unsigned long) filestats.st_nlink, 
    filestats.st_uid, 
    filestats.st_gid, 
    (unsigned long long) filestats.st_size, 
    date, 
    filename); 

मैं कैसे एक पोर्टेबल और कुशल तरीके से इन प्रकार के प्रिंट करूं एक स्टेट struct के क्षेत्र सभी विशेष प्रकार के होते हैं? सबसे पहले मैंने सही स्वरूप विनिर्देशकों का अनुमान लगाकर इसे बिना किए। एक परेशान प्रोग्रामिंग आदत होने के अलावा, इसका मतलब यह भी था कि मेरा कोड 32 बिट सिस्टम पर काम नहीं करेगा। अब जानवरों के साथ काम करना प्रतीत होता है, लेकिन कितने प्लेटफॉर्म पर?

+0

विशिष्ट: उदाहरण के लिए: http://stackoverflow.com/questions/1083142/what-s-the-correct-way-to-use-printf-to-print-a-clock-t –

+0

'__uint128' के लिए: http://stackoverflow.com/questions/11656241/how-to-print-uint128-t-number-using-gcc –

उत्तर

25

ऐसा करने का एक बिल्कुल पोर्टेबल तरीका नहीं है, और यह एक उपद्रव है।

सी 99 size_t%zu नोटेशन के साथ अंतर्निहित प्रकारों के लिए एक तंत्र प्रदान करता है (और कुछ अतिरिक्त, समान क्वालीफायर हैं)।

printf("32-bit integer: 0x%08" PRIX32 "\n", var_of_type_int32_t); 

प्रणाली द्वारा परिभाषित प्रकार के लिए (जैसे:

यह भी एक 32-बिट हेक्साडेसिमल निरंतर (इस मामले में) मुद्रण के लिए सही क्वालीफायर परिभाषित करने के लिए इस तरह के रूप में PRIX32 मैक्रो के <inttypes.h> हैडर प्रदान करता है पीओएसआईक्स द्वारा परिभाषित किए गए), AFAIK, उन्हें संभालने का कोई अच्छा तरीका नहीं है। तो, मैं जो करता हूं वह 'सुरक्षित' रूपांतरण पर उड़ने का अनुमान लगाता है और फिर तदनुसार प्रिंट करता है, जिसमें कलाकार शामिल है, जो आप इस सवाल में बताते हैं। यह निराशाजनक है, लेकिन मुझे कोई बेहतर तरीका नहीं है। संदेह के मामले में, और सी 99 का उपयोग करते हुए, फिर 'हस्ताक्षरित लंबे समय तक' रूपांतरण बहुत अच्छा है; uintmax_t और PRIXMAX या समकक्ष पर कास्ट का उपयोग करने के लिए एक मामला हो सकता है।

या FUZxxlreminded मुझे, आप 'अधिकतम' पूर्णांक प्रकार को इंगित करने के लिए संशोधक j का उपयोग कर सकते हैं। clock_t के लिए

printf("Maximal integer: 0x%08jX\n", (uintmax_t)var_of_type_without_format_letter); 
+2

यह बेहतर नहीं कहा जा सका। (U) intmax_t और पीआरआई (डी | यू) MAX (या समतुल्य) का उपयोग करना सबसे समस्याग्रस्त सिस्टम-परिभाषित प्रकारों के लिए सबसे अच्छा समाधान हो सकता है। –

+1

मैं पहले से ही उन मैक्रो को जानता था लेकिन वे मेरे लिए बहुत बदसूरत लग रहे थे। सलाह के लिए धन्यवाद। – kmm

+2

वे बदसूरत हैं, लेकिन वे पोर्टेबल के निकटतम चीज़ हैं जिन्हें मैं जानता हूं। –

संबंधित मुद्दे

 संबंधित मुद्दे