2013-02-04 12 views
5

अस्वीकरण: यह एक असाइनमेंट के लिए है। मैं स्पष्ट कोड नहीं मांग रहा हूं। इसके बजाय, मैं केवल पर्याप्त मदद मांगता हूं कि मैं अपनी समस्या को समझ सकता हूं और इसे स्वयं ठीक कर सकता हूं।फ़ाइल आईओ सही ढंग से पढ़ने के लिए प्रतीत नहीं होता है

मैं होमवर्क असाइनमेंट के अनुसार यूनिक्स ar उपयोगिता को फिर से बनाने का प्रयास कर रहा हूं। इस असाइनमेंट का अधिकांश हिस्सा सी में फाइल आईओ से संबंधित है, और अन्य भागों सिस्टम कॉल आदि से निपटते हैं ..

इस उदाहरण में, मैं संग्रह के भीतर सभी फ़ाइलों की एक साधारण सूची बनाना चाहता हूं। जैसा कि आप नोटिस कर सकते हैं, मैं दूर नहीं मिला है। योजना अपेक्षाकृत सरल है: प्रत्येक फ़ाइल शीर्षलेख को संग्रह फ़ाइल से पढ़ें और केवल ar_hdr.ar_name में आयोजित मान मुद्रित करें। शेष फ़ील्ड को fseek() के माध्यम से छोड़ दिया जाएगा, जिसमें फ़ाइल डेटा भी शामिल है, जब तक कि कोई अन्य फ़ाइल न पहुंच जाए, जिस बिंदु पर प्रक्रिया फिर से शुरू होती है। यदि ईओएफ पहुंचा है, तो फ़ंक्शन बस समाप्त हो जाता है।

मुझे फ़ाइल IO के साथ थोड़ा सा अनुभव नहीं है, इसलिए मैं इस असाइनमेंट के साथ पहले से ही नुकसान का सामना कर रहा हूं। मैंने अपने लक्ष्यों को प्राप्त करने के उचित तरीकों का शोध करने के लिए अपना सर्वश्रेष्ठ प्रयास किया है, और मेरा मानना ​​है कि मैंने उन्हें अपनी योग्यता के लिए लागू किया है। उस ने कहा, मेरे कार्यान्वयन के साथ कुछ गलत लगता है। संग्रह फ़ाइल से डेटा को पढ़ने के लिए प्रतीत नहीं होता है, या कम से कम एक चर के रूप में संग्रहीत किया जाता है। यहां मेरा कोड है:

struct ar_hdr 
{ 
    char ar_name[16]; /* name */ 
    char ar_date[12]; /* modification time */ 
    char ar_uid[6];  /* user id */ 
    char ar_gid[6];  /* group id */ 
    char ar_mode[8]; /* octal file permissions */ 
    char ar_size[10]; /* size in bytes */ 
}; 

void table() 
{ 
    FILE *stream; 
    char str[sizeof(struct ar_hdr)]; 
    struct ar_hdr temp; 

    stream = fopen("archive.txt", "r"); 
    if (stream == 0) 
    { 
     perror("error"); 
     exit(0); 
    } 

    while (fgets(str, sizeof(str), stream) != NULL) 
    { 
     fscanf(stream, "%[^\t]", temp.ar_name); 
     printf("%s\n", temp.ar_name); 
    } 
    if (feof(stream)) 
    { 
     // hit end of file 
     printf("End of file reached\n"); 
    } 
    else 
    { 
     // other error interrupted the read 
     printf("Error: feed interrupted unexpectedly\n"); 
    } 

    fclose(stream); 
} 

इस बिंदु पर, मैं केवल डेटा को सही ढंग से पढ़ने में सक्षम होना चाहता हूं। मैं समाप्त होने के बाद अगली फाइल की तलाश करने पर काम करूंगा। मैं अपने बिंदु को दोहराना चाहूंगा, हालांकि, मैं स्पष्ट कोड नहीं मांग रहा हूं - मुझे यह सामान सीखने की ज़रूरत है और मुझे कोई मुझे कामकाजी कोड प्रदान करने की ज़रूरत नहीं है।

+2

+1 इस तरह लिखने के लिए +1 है कि सभी "ब्लाह-ब्लाह होमवर्क के बारे में कुछ टिप्पणियों" की आवश्यकता को कम करता है। – ChiefTwoPencils

उत्तर

3

आप एक char बफर str नामित अपने डेटा रखने के लिए परिभाषित किया गया है, लेकिन आप temp नाम के एक अलग स्मृति ar_hdr संरचना से यह तक पहुँच रहे हैं। साथ ही, आप एक स्ट्रिंग के रूप में बाइनरी डेटा पढ़ रहे हैं जो एम्बेडेड नल के कारण टूट जाएगा।

आप str के लिए सूचक होने के लिए के रूप में बाइनरी डेटा पढ़ सकते हैं और या तो temp बदलने के लिए या की तरह कुछ का उपयोग कर सीधे temp में पढ़ने की जरूरत है:

ret=fread(&temp,sizeof(temp),1,stream); 

(fread के लिए doco को देखो - मेरी सी भी जंग लगी है इसके बारे में सुनिश्चित करने के लिए)। सुनिश्चित करें कि आप वापसी मूल्य की जांच करें और उपयोग करें।

+1

मैं * सोचता हूं * वह पूरे हेडर को 'str' में पढ़ने की कोशिश कर रहा था, फिर उस डेटा को उसकी' temp' संरचना में खींचें? –

+1

@ ब्रायन: संभवतः; मैं उन्हें उन पॉइंटर्स देने की कोशिश कर रहा हूं जिनकी उन्हें जरूरत है। –

+0

@SoftwareMonkey: ब्रायन सही है, यह मेरा इरादा था। मैं आदमी के लिए एक और स्टैब ले जाऊंगा और देख सकता हूं कि मुझे कौन से बदलाव करने की ज़रूरत है। मैंने एम्बेडेड नल की संभावना पर विचार नहीं किया था। मैं fseek() का उपयोग करके सब कुछ छोड़ने के लिए हेडर जानकारी का उपयोग करना चाहता हूं, इसलिए जब तक उसमें एक शून्य मूल्य शामिल न हो, जो एक गंभीर समस्या होगी, एम्बेडेड नल में चलना समस्या नहीं होनी चाहिए, है ना? – idigyourpast

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