2013-04-02 17 views
25

के बीच फ्लोट परिवर्तन की लंबाई फ़ाइल में float मान निर्यात करते समय मुझे एक अजीब समस्या का सामना करना पड़ा। मैं उम्मीद करता हूं कि प्रत्येक फ्लोट एक ही लंबाई (जाहिर है) होने की उम्मीद करेगी, लेकिन मेरा प्रोग्राम कभी-कभी इसे 32 बिट नंबर और कभी-कभी 40 बिट नंबर के रूप में निर्यात करता है। एक एक प्रोग्राम है जो अभी भी इस व्यवहार से पता चलता की न्यूनतम काम कर उदाहरण है:32 और 40 बिट

#include <stdio.h> 

const char* fileName = "C:/Users/Path/To/TestFile.txt"; 
float array [5]; 

int main(int argc, char* argv []) 
{ 
    float temp1 = 1.63006e-33f; 
    float temp2 = 1.55949e-32f; 

    array[0] = temp1; 
    array[1] = temp2; 
    array[2] = temp1; 
    array[3] = temp2; 
    array[4] = temp2; 

    FILE* outputFile; 
    if (!fopen_s(&outputFile, fileName, "w")) 
    { 
     fwrite(array, 5 * sizeof(float), 1, outputFile); 
     fclose(outputFile); 
    } 

    return true; 
} 

मैं आउटपुट फ़ाइल वास्तव में 20 (5 बार 4) बाइट्स, जिनमें से प्रत्येक चार एक नाव का प्रतिनिधित्व शामिल करने के लिए उम्मीद करेंगे। हालांकि, मैं इस मिल:

8b 6b 07 09  // this is indeed 1.63006e-33f 
5b f2 a1 0d 0a // I don't know what this is but it's a byte too long 
8b 6b 07 09  
5b f2 a1 0d 0a 
5b f2 a1 0d 0a 

तो नाव temp2 चार के बजाय 5 बाइट्स लेता है, और वह फ़ाइल की कुल लंबाई 23 है यह कैसे संभव है ?! संख्या इतनी छोटी नहीं है कि वे असामान्य संख्याएं हैं, और मैं किसी भी अन्य कारण के बारे में नहीं सोच सकता कि आकार में कोई अंतर क्यों होगा।

मैं 64-बिट विंडोज 7 सिस्टम पर एमएसवीसी 2010 कंपाइलर का उपयोग कर रहा हूं।

नोट:मैं पहले से ही एक बहुत ही इसी तरह के प्रश्न पूछा यहाँ है, लेकिन जब मुझे एहसास हुआ कि समस्या अधिक सामान्य था, मैं एक और अधिक संक्षिप्त तरीके से इसे repost का फैसला किया। QDataStream uses sometimes 32 bit and sometimes 40 bit floats

+2

असल में, 'बी' के बिना 'fopen' वाली किसी भी फ़ाइल को कभी भी नहीं खोलें। – zneak

+1

बस खुश रहें कि आपके परीक्षण मूल्यों में से एक '0.5392157' नहीं था! –

+1

[बाइनरी और टेक्स्ट मोड] (http://stackoverflow.com/questions/229924/difference-between-files-writen-in-binary-and-text-mode#) –

उत्तर

41

समस्या यह है कि विंडोज़ पर, आपको टेक्स्ट और बाइनरी फ़ाइलों के बीच अंतर करना होगा। आपके पास फ़ाइल के रूप में फ़ाइल खोली गई है, जिसका अर्थ है 0d (कैरिज-रिटर्न) प्रत्येक 0a (लाइन-फीड) से पहले डाला गया है। इस तरह की फ़ाइल खोलें:

if (!fopen_s(&outputFile, fileName, "wb")) 

बाकी की तरह पहले, और इसे काम करना चाहिए।

+1

कुडोस। –

+1

यह आश्चर्यजनक है, इस पत्र ने सबकुछ हल किया (यानी दीवार के खिलाफ मेरे सिर को टक्कर देने के दो दिन)। – Yellow

+1

चिंता न करें, हम सभी को कभी-कभी ऐसा लगता है। –

12

आप टेक्स्ट नहीं लिख रहे हैं; आप द्विआधारी डेटा लिख ​​रहे हैं ... हालांकि, आपकी फ़ाइल ("w") लिखने के बजाय बाइनरी ("wb") लिखने के लिए खुली है। इसलिए, fwrite()'\n' से "\r\n" का अनुवाद कर रहा है।

बदलें इस:

if (!fopen_s(&outputFile, fileName, "w")) 
इस के लिए

:

if (!fopen_s(&outputFile, fileName, "wb")) 

"wb" में, b द्विआधारी मोड के लिए खड़ा है।