fscanf

2010-07-22 28 views
12

का उपयोग करते समय एक चर के रूप में चौड़ाई मैं फ़ाइल के एक निश्चित हिस्से में पढ़ने की कोशिश कर रहा हूं और डेटा की मात्रा प्रति पंक्ति अलग है लेकिन मुझे पता है कि मैं कितनी बाइट्स चाहता हूं।fscanf

5bytes.byte1byte2byte3byte4byte5CKSum //where # of bytes varies for each line (and there is no period only there for readability) 

वास्तविक डेटा::,

fscanf_s(in_file,"%variableX", &iData); 

यह संभव है क्योंकि अभी मैं:

05AABBCCDDEE11 
03AABBCC22 
04AABBCCDD33 

तो मैं करने के लिए मेरी चौड़ाई इस तरह एक चर होना चाहते हैं तो इस तरह सोच रहा है कि मुझे केस स्टेटमेंट बनाना है?

+1

आपको जो कुछ पूछ रहा है उसे स्पष्ट करने की आवश्यकता है। –

+0

मूल रूप से मैं बस एक चर के साथ चौड़ाई सेट करने में सक्षम होना चाहता हूं जिसे मैं "% 5X" के बजाय पढ़ने वाली प्रत्येक पंक्ति में बदल सकता हूं - जहां मैं 5 की चौड़ाई तक सीमित हूं, मैं बस अपना स्वयं का चर डालना चाहता हूं वहां मेरी चौड़ाई गतिशील हो सकती है। –

उत्तर

10

दुर्भाग्यवश, नहीं, printf के लिए '*' जैसे कोई संशोधक नहीं है जिससे स्कैनफ को चर के क्षेत्र की चौड़ाई या परिशुद्धता प्राप्त हो जाती है। निकटतम आप आ सकते हैं गतिशील रूप से प्रारूप स्ट्रिंग बना रहा है:

char format[8]; 
sprintf(format, "%%%dX", width); 
fscanf(in_file, format, &iData); 
+0

आपके पास + फ़ाइल में है, जो in_file होना चाहिए। – SCFrench

0

% एक्स के साथ fscanf स्वचालित रूप से एक नई लाइन पर रुक जाएगा, है ना? खेतों वास्तव में न्यू लाइन-समाप्त (अपने उदाहरण के रूप में) है, तो नहीं तुम सिर्फ

fscanf(in_file, "%X", &iData); 

फोन और fscanf यह पता लगाने जहां अंत है दे सकते हैं?

+0

हां ठीक है मैंने वास्तव में एक गलती की है अंत में एक चेकसम है जो मैं नहीं चाहता। तो यह मेरे लिए काम नहीं करेगा। –

0

आप सी ++ धाराओं का उपयोग करने पर भी विचार कर सकते हैं।

#include <ifstream> 
#include <iostream> 

// open the file and create a file input stream 
ifstream file("test.txt" , ios::in | ios::binary); 

// loop through the whole file 
while (ifs.good()) 
{ 
    // extract one byte as the field width 
    unsigned char width; 
    file.read(&width, 1); 

    // extract width number of unformatted bytes 
    char * bytes = new char[width]; 
    file.read(bytes, width); 

    // process the bytes 
    ... 
    delete [] bytes; 

    // skip EOL characters if needed 
    // file.seekg(1, ios_base::cur) 
} 

file.close(); 

यदि आपको लगता है कि न्यूलाइन शामिल हैं, तो एक आसान तरीका है getLine() का उपयोग करना होगा। पढ़ें(), get(), getLine() और अन्य महान स्ट्रीम फ़ंक्शंस का उपयोग करने के अधिक तरीकों के लिए http://www.cplusplus.com/reference/iostream/ifstream/ देखें।

0

मुझे लगता है कि सबसे सरल) fread (उपयोग करने के लिए इस तरह होगा:

fread(buffer, nbytes, sizeof(char), in_file); 
1

तुम सच में प्रोग्राम के रूप में fscanf प्रारूप को समायोजित करने में सक्षम होना चाहते हैं, तो आप की कोशिश कर सकते के साथ एक स्ट्रिंग स्टैक-आवंटन पर्याप्त स्थान, और फिर प्रारूप को उत्पन्न करना: उदा।

char formatString[100]; 

// writes "%max_size[0-9]", substituting max_size with the proper digits 
sprintf(formatString, "%%%d[0-9]", MAX_SIZE); 

fscanf(fp, formatString, buffer); // etc... 
संबंधित मुद्दे