सी

2011-06-02 5 views
9

में पढ़ने() और fgets() के बीच अंतर मैं एक stdin स्ट्रीम से पढ़ना चाहता हूँ। Stdin स्ट्रीम से पढ़ने के लिए पढ़ने() या fgets() का उपयोग करने में कोई अंतर है।सी

मैं कोड के निम्नलिखित दो टुकड़ों को fgets और पढ़ने के साथ जोड़ रहा हूँ। fgets के साथ मैं सी प्रोग्राम से आसानी से लिखने और पढ़ने के लिए एक जावा प्रोग्राम का उपयोग कर सकता हूं। मेरे जावा प्रोग्राम को पढ़ने और लिखने के साथ सी प्रोग्राम से आउटपुट के लिए इंतजार कर रहा है जो नहीं आता है।

मैं बस इसे एक पंक्ति में पढ़ रहा हूं और इसे ए में जोड़ रहा हूं।

जावा प्रोग्राम निम्न प्रोग्राम से बात करने में सक्षम है जो fgets और puts के साथ काम करता है।

#include <stdio.h> 
#include <string.h> 
#define SIZE 200000 
main() 
{ 
int rc; 
int df; 
int i; 
char buf[SIZE]; 
for(i=0;i<=120000;i++) { 
     memset(buf,'\0',SIZE); 
     if(!fgets(buf,SIZE-1,stdin)) 
     continue; 
     strcat(buf,"A_A_A_A_A_A_A"); 
     puts(buf); 
} 

}

लेकिन पढ़ने के साथ नहीं() और लिखने()

main() 
{ 
int rc; 
int df; 
int i; 
char buf[32768]; 
rc = fcntl(fileno(stdin), F_SETFL, O_NONBLOCK); 
//rc = fcntl(fileno(stdout), F_SETFL, O_NONBLOCK); 
FILE *fp; 
for (;;) 
{ 
    int rc=-1; 
    memset(buf,'\0',32768); 
    //rc = fread(buf,5, 1, stdin); 
    rc = read(fileno(stdin),buf,32768); 
    if (rc > 0) 
    { 
     strcat(buf,"B_B_B_B_B_B_B_B_B"); 
     write(fileno(stdout),buf,strlen(buf)); 

    } 
} 

}

कुछ एक कारण बता सकते हैं। मैं अभी भी यह मुश्किल बाहर

+0

@DarkDust वह केवल 7 सवाल मिला है, यह इतना बुरा :-) – cnicutar

+1

@cnicutar नहीं है: यह देखते हुए उसके सवालों के दो आधे साल पुराने हैं और अन्य मार्च से भी कर रहे हैं कि या april यह * बुरा है। – DarkDust

+0

हे खेद है कि मुझे जवाब स्वीकार करने के लिए एक तंत्र के बारे में पता नहीं था। मैं करूँगा – ssD

उत्तर

21
  • fgets एक समारोह है, read लगाने की है एक सिस्टम कॉल
  • fgets मानक सी है, लग रहा है read
  • fgets stdio बफ़र नहीं है read
  • नहीं है एक FILE * साथ fgets काम करता है, एक फ़ाइल वर्णनकर्ता
  • fgets न्यू लाइन तक पढ़ता साथ read काम करता है, read पढ़ता कितना आप इसे

और अधिक की आवश्यकता है? जबकि अन्य (fgets) एक पंक्ति को पढ़ने के लिए प्रयास करता है और एक नई पंक्ति में बंद हो जाएगी

+3

'fgets()' बफर को एक शून्य बाइट जोड़ता है (जो 'स्ट्रैक() 'से शुरू करने के लिए एक जगह देता है); 'पढ़ें() 'नहीं करता है। – EJP

0

एक (read), बाइट्स की निर्धारित संख्या को पढ़ने के लिए प्रयास करता है।

0

दोनों कार्यों में कुछ भी सामान्य नहीं है। पढ़ना एक पॉज़िक्स सिस्टम कॉल है, जो फ़ाइल हैंडल से पढ़ता है। fgets सी पुस्तकालय समारोह है जो एक फ़ाइल * से पढ़ता है।

6

नहीं है एक महत्वपूर्ण विकल्प (fread) जो बीच में कुछ हद तक बैठता है, तो सवाल वास्तव में दो भागों में टूट जाना चाहिए - और दोनों पहले से ही अच्छी तरह से इतना में उत्तर दिया जाता है:

fread and read के बीच क्या अंतर है?

fgets and fread के बीच क्या अंतर है?

अंगूठे का त्वरित नियम: fgets उपयोग करें यदि आप, लाइन द्वारा टेक्स्ट का डेटा लाइन पढ़ fread कहीं और उपयोग करना चाहते हैं।

2
#include <stdio.h> 
char fgets (char * restrict str, int size, FILE * restrict stream) 

fgets() समारोह को देखते हुए धारा से आकार द्वारा निर्दिष्ट वर्णों की संख्या की तुलना में अधिक से अधिक एक कम पढ़ता है और स्ट्रिंग str में उन्हें संग्रहीत करता है।पढ़ना बंद हो जाता है जब एक न्यूलाइन चरित्र मिलता है, अंत में फ़ाइल या त्रुटि पर।

संदर्भ: fgets()

#include <unistd.h> 
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset); 

पढ़ने() समारोह बफर में, खुले फ़ाइल वर्णनकर्ता, fildes के साथ जुड़े फ़ाइल से nbyte बाइट्स पढ़ने के लिए प्रयास करेगा buf द्वारा की ओर इशारा किया । एक ही पाइप, फीफो, या टर्मिनल डिवाइस पर एकाधिक समवर्ती पढ़ने का व्यवहार अनिर्दिष्ट है।

संदर्भ: read()

+0

+1 @ एंड्रेई opengroup (और cplusplus) के लिए नहीं ... लेकिन आप POSIX.1- के बजाय [POSIX.1-2008 संदर्भ] (http://pubs.opengroup.org/onlinepubs/9699919799/) का उपयोग कर सकते हैं। 2004 आपके लिंक में;) – pmg

+0

अद्यतन संदर्भ लिंक, @pmg। मेरे उत्तर को सही करने के लिए धन्यवाद। – sfat

+0

@Andrei ... उपर्युक्त कार्यक्रमों के आधार पर मैं भिन्नता नहीं बता सकता अगर मैं * stdin * से पढ़ने के लिए fgets का उपयोग कर रहा हूं या stdin पढ़ने के लिए पढ़ता हूं। इसी तरह रखता है (buf) मुझे बाहरी प्रोग्राम के माध्यम से stdout से पढ़ने में मदद करता है और इसलिए लिखता है (stdout, buf)। लेकिन लिखना धीमा है तो रखता है और रखता है बाहरी जावा प्रोग्राम के साथ काम करता है ... क्या आप इस – ssD