2010-06-20 9 views
14

संपूर्ण गुगलिंग और कई मंचों पर जाने के बाद, मुझे अभी तक इस प्रश्न के लिए एक अच्छा व्यापक उत्तर नहीं मिला है। बहुत से फ़ोरम istream& getline (char* s, streamsize n) फ़ंक्शन प्राप्त करने का सुझाव देते हैं। मेरा सवाल यह है कि अगर मुझे नहीं पता कि प्रत्येक पंक्ति की लंबाई क्या है और भविष्यवाणी नहीं कर सकती कि आकार क्या हो सकता है? इसके अलावा सी में बराबर क्या है?सी/सी ++ में टेक्स्ट फ़ाइल से लाइन को कैसे पढ़ा जाए?

वहाँ एक एकल लाइन पाठ फ़ाइल से हर बार पढ़ने के लिए C/C++ में कोई विशेष समारोह है?

स्पष्टीकरण, कोड के टुकड़े के साथ मुझे एक बहुत मदद मिलेगी।

+1

यह एक dup के रूप में यह विशेष रूप से सी के बारे में पूछता है नहीं है , और माना जाता है कि 'डुप्ल' विशेष रूप से सी ++ के बारे में पूछ रहा है। – sje397

+0

@sje यह प्रश्न सी ++ में भी कहता है ... –

+1

@DannyBeckett हाँ मैंने देखा। मुझे नहीं लगता कि यह मेरे बिंदु से प्रासंगिक है, क्योंकि यह एक (दूसरे के विपरीत) सी के बारे में पूछता है, जो इसे गुणात्मक रूप से अलग बनाता है। – sje397

उत्तर

18

ग में, आप fopen, और getch इस्तेमाल कर सकते हैं। आमतौर पर, यदि आप सबसे लंबी लाइन की लंबाई के बारे में बिल्कुल निश्चित नहीं हो सकते हैं, तो आप एक बड़ा बफर आवंटित कर सकते हैं (उदा। 8 केबी) और लगभग सभी लाइनों को प्राप्त करने की गारंटी दी जा सकती है।

यदि कोई मौका है तो आपके पास वास्तव में लंबी लाइनें हो सकती हैं और आपको लाइन से लाइन को संसाधित करना होगा, तो आप एक resonable बफर malloc कर सकते हैं, और हर बार जब आप इसे भरने के करीब आते हैं तो इसे आकार में दोगुना करने के लिए realloc का उपयोग करें।

#include <stdio.h> 
#include <stdlib.h> 

void handle_line(char *line) { 
    printf("%s", line); 
} 

int main(int argc, char *argv[]) { 
    int size = 1024, pos; 
    int c; 
    char *buffer = (char *)malloc(size); 

    FILE *f = fopen("myfile.txt", "r"); 
    if(f) { 
     do { // read all lines in file 
     pos = 0; 
     do{ // read one line 
      c = fgetc(f); 
      if(c != EOF) buffer[pos++] = (char)c; 
      if(pos >= size - 1) { // increase buffer length - leave room for 0 
      size *=2; 
      buffer = (char*)realloc(buffer, size); 
      } 
     }while(c != EOF && c != '\n'); 
     buffer[pos] = 0; 
     // line is now in buffer 
     handle_line(buffer); 
     } while(c != EOF); 
     fclose(f);   
    } 
    free(buffer); 
    return 0; 
} 
+1

चार सी; ??? !!! बंद (एफ) ?? और malloc.h !!! stdlib.h – Nyan

+0

@Nyan - चीयर्स, निश्चित – sje397

3

getline() आप जो खोज रहे हैं है। आप सी ++ में तारों का उपयोग करते हैं, और आपको समय से पहले आकार जानने की आवश्यकता नहीं है।

मान लिया जाये कि एसटीडी नाम स्थान:

ifstream file1("myfile.txt"); 
string stuff; 

while (getline(file1, stuff, '\n')) { 
     cout << stuff << endl; 
} 

file1.close(); 
+0

नोट: आप 'std :: getline (std :: istream &, std :: string &)' std :: istream :: getline' नहीं चाहते हैं। –

+2

हम सी में यह कैसे करेंगे? –

22

सी ++ में, आप वैश्विक समारोह std :: getline उपयोग कर सकते हैं, यह एक स्ट्रिंग और एक धारा और एक वैकल्पिक सीमांकक लेता है और जब तक सीमांकक निर्दिष्ट पहुँच जाता है 1 लाइन पढ़ता । एक उदाहरण:

#include <string> 
#include <iostream> 
#include <fstream> 

int main() { 
    std::ifstream input("filename.txt"); 
    std::string line; 

    while(std::getline(input, line)) { 
     std::cout<<line<<'\n'; 
    } 

    return 0; 
} 

यह प्रोग्राम फ़ाइल से प्रत्येक पंक्ति को पढ़ता है और इसे कंसोल पर echos पढ़ता है।

सी के लिए आप शायद fgets का उपयोग कर रहे हैं, यह थोड़ी देर के बाद से मैंने सी का उपयोग किया है, जिसका अर्थ है कि मैं थोड़ा जंगली हूं, लेकिन मेरा मानना ​​है कि आप उपर्युक्त सी ++ प्रोग्राम की कार्यक्षमता को अनुकरण करने के लिए इसका उपयोग कर सकते हैं इसलिए:

#include <stdio.h> 

int main() { 
    char line[1024]; 
    FILE *fp = fopen("filename.txt","r"); 

    //Checks if file is empty 
    if(fp == NULL) {      
     return 1; 
    } 

    while(fgets(line,1024,fp)) { 
     printf("%s\n",line); 
    } 

    return 0; 
} 

सीमा के साथ कि रेखा उस बफर की अधिकतम लंबाई से अधिक नहीं हो सकती है जिसे आप पढ़ रहे हैं।

+0

धन्यवाद। सी में हम वही कैसे करेंगे? कोई चीज है? –

+0

मेरी पोस्ट को अपडेट करने के तरीके के साथ अपडेट किया गया, मुझे उम्मीद है कि यह सही है जैसा कि मैंने इसे रखा है, अन्यथा लोग यह बताएंगे कि मैंने क्या गलत किया है। – Jacob

+0

धन्यवाद, मैं सोच रहा था कि निश्चित लंबाई के बफर का उपयोग करने से बेहतर तरीका था या नहीं। मुझे लगता है कि अब मुझे पता है कि हमें बफर आकार को कड़ी मेहनत करने की आवश्यकता है। –

7

सी में, fgets(), और आप काट-छांट को रोकने के लिए अधिकतम आकार पता करने की जरूरत।

+0

यह सी के लिए सबसे अच्छा जवाब है, इसमें अधिक अपवर्त होना चाहिए। (असल में 'गेटलाइन' अच्छा है, लेकिन गैर मानक।) –

4

im वास्तव में उस सेल्सियस पर अच्छा नहीं है, लेकिन मेरा मानना ​​है इस कोड को आप अंत तक पूरा एक पंक्ति मिलना चाहिए ...

#include<stdio.h> 

int main() 
{  
    char line[1024];  
    FILE *f=fopen("filename.txt","r");  
    fscanf(*f,"%[^\n]",line);  
    printf("%s",line);  
}  
+1

आपको 'fscanf' से बचना चाहिए क्योंकि यह बफर ओवरफ़्लो का कारण बनता है। यह इनपुट के आकार को उस बफर के आकार तक सीमित करने का तरीका प्रदान करता है जो लिख रहा है (यहां, 'लाइन')। –

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