2009-09-25 15 views
16

मैं एक फ़ाइल से डेटा को कैसे पढ़ अगर मेरी फाइल कॉमा सेपरेटेड वैल्यूज़कैसे करें कॉमा सेपरेटेड वैल्यूज़

1, 2, 3, 4, 5\n 
6, 7, 8, 9, 10\n 
\n 

साथ और फ़ाइल को पढ़ने के बाद इस तरह है, मैं चाहता हूँ के साथ पाठ फ़ाइल से/में पढ़ने-लिखने डेटा को दूसरी फ़ाइल में ऊपर उसी प्रारूप के रूप में लिखने के लिए।

मैं, लाइनों की कुल संख्या प्राप्त

string line; 
while(!file.eof()){ 
     getline(file,line); 
     numlines++; 
    } 
    numline--; // remove the last empty line 

का उपयोग कर सकते हैं, लेकिन मैं कैसे एक पंक्ति/लाइन में अंकों की कुल संख्या पता कर सकते हैं ??

मेरे पास डेटा स्टोर करने के लिए स्याही के वेक्टर भी हैं। तो, मैं पहली पंक्ति को पढ़ना चाहता हूं और उसके बाद उस पंक्ति में तत्वों की कुल संख्या गिनती हूं, यहां 5 (1,2,3,4,5) और उन्हें सरणी/वेक्टर में स्टोर करें, और अगली पंक्ति पढ़ें और उन्हें स्टोर करें जब तक मैं ईओएफ तक नहीं पहुंच जाता तब तक वेक्टर फिर से।

फिर, मैं, फाइल करने के लिए डेटा लिखने के लिए चाहते हैं फिर से, मुझे लगता है इस फाइल करने के लिए डेटा लेखन के काम करेगा,

numOfCols=1; 
for(int i = 0; i < vector.size(); i++) 
{ 
    file << vector.at(i); 
    if((numOfCols<5) file << ",";//print comma (,) 
    if((i+1)%5==0) 
    { 
        file << endl;//print newline after 5th value 
        numOfCols=1;//start from column 1 again, for the next line 
    } 
    numOfCols++; 
} 
file << endl;// last new line 

तो, मेरी मुख्य समस्या फ़ाइल से डेटा को पढ़ने के लिए कैसे है अल्पविराम से अलग मूल्यों के साथ ??

धन्यवाद

उत्तर

24

चरण 1: ऐसा मत करो:

while(!file.eof()) 
{ 
    getline(file,line); 
    numlines++; 
} 
numline--; 

EOF सच जब तक आप कोशिश करते हैं और यह अतीत को पढ़ने नहीं है। मानक पैटर्न है:

while(getline(file,line)) 
{ 
    ++numline; 
} 

भी ध्यान रखें कि std :: getline() वैकल्पिक रूप से एक तिहाई पैरामीटर ले सकते हैं। यह तोड़ने का चरित्र है। डिफ़ॉल्ट रूप से यह लाइन टर्मिनेटर है लेकिन आप एक अल्पविराम निर्दिष्ट कर सकते हैं।

while(getline(file,line)) 
{ 
    std::stringstream linestream(line); 
    std::string   value; 

    while(getline(linestream,value,',')) 
    { 
     std::cout << "Value(" << value << ")\n"; 
    } 
    std::cout << "Line Finished" << std::endl; 

} 

आप एक ही वेक्टर में सभी मान संग्रहीत हैं तो उन्हें एक निश्चित चौड़ाई का उपयोग कर प्रिंट आउट। तो मैं ऐसा कुछ करूंगा।

#include <sstream> 

शायद ज़रुरत पड़े, Stroustrup की 'सी ++ प्रोग्रामिंग भाषा विशेष संस्करण "पेज 641 उदाहरण देखो:

struct LineWriter 
{ 
     LineWriter(std::ostream& str,int size) 
       :m_str(str) 
       ,m_size(size) 
       ,m_current(0) 
     {} 

     // The std::copy() does assignement to an iterator. 
     // This looks like this (*result) = <value>; 
     // So overide the operator * and the operator = to 
     LineWriter& operator*() {return *this;} 
     void operator=(int val) 
     { 
       ++m_current; 
       m_str << val << (((m_current % m_size) == 0)?"\n":","); 
     } 

     // std::copy() increments the iterator. But this is not usfull here 
     // so just implement too empty methods to handle the increment. 
     void operator++()  {} 
     void operator++(int) {} 

     // Local data. 
     std::ostream&   m_str; 
     int const    m_size; 
     int      m_current; 
}; 

void printCommaSepFixedSizeLinesFromVector(std::vector const& data,int linesize) 
{ 
    std::copy(data.begin(),data.end(),LineWriter(std::cout,linesize)); 
} 
+0

यह क्या करता है? std :: स्ट्रिंगस्ट्रीम linestream (रेखा); – Curious

+0

यह एक स्ट्रिंग स्ट्रीम ऑब्जेक्ट बनाता है। यह सिर्फ एक स्ट्रीम की तरह कार्य करता है, जैसे std :: cin, std :: cout या फ़ाइल स्ट्रीम std :: fstream, लेकिन डेटा के स्रोत के रूप में एक स्ट्रिंग का उपयोग करता है। तो असल में यह सिर्फ एक पंक्ति की धारा है। –

+0

जब मैं संकलित करने का प्रयास करता हूं, मुझे यह त्रुटि मिलती है, चर 'std :: stringstream linestream' में प्रारंभकर्ता है लेकिन अधूरा प्रकार है। मैंने आवश्यक सभी शीर्षकों को शामिल किया है। – Curious

0

stringstream वर्ग की कोशिश करो।

यह मेरे लिए काम करता है और मेरे पास यह पता लगाने की कोशिश करने का समय था।

5

यहां मैं सीएसवी पढ़ने के साथ-साथ कोड लिखने के लिए कोड पोस्ट कर रहा हूं। मैंने अपने कामकाजी जुर्माना की जांच की है।

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> 
using namespace std; 

void readCSV(istream &input, vector< vector<string> > &output) 
{ 
    string csvLine; 
    // read every line from the stream 
    while(getline(input, csvLine)) 
    { 
      istringstream csvStream(csvLine); 
      vector<string> csvColumn; 
      string csvElement; 
      // read every element from the line that is seperated by commas 
      // and put it into the vector or strings 
      while(getline(csvStream, csvElement, ',')) 
      { 
        csvColumn.push_back(csvElement); 
      } 
      output.push_back(csvColumn); 
    } 
} 

int main() 
{ 
    ofstream myfile; 
    string a; 
    fstream file("b.csv", ios::in); 
    myfile.open ("ab.csv"); 
    if(!file.is_open()) 
    { 
      cout << "File not found!\n"; 
      return 1; 
    } 
    // typedef to save typing for the following object 
    typedef vector< vector<string> > csvVector; 
    csvVector csvData; 

    readCSV(file, csvData); 
    // print out read data to prove reading worked 
    for(csvVector::iterator i = csvData.begin(); i != csvData.end(); ++i) 
    { 
      for(vector<string>::iterator j = i->begin(); j != i->end(); ++j) 
      { 
      a=*j; 
        cout << a << " "; 
      myfile <<a<<","; 

} 
myfile <<"\n"; 
cout << "\n"; 
} 
myfile.close(); 
system("pause"); 

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