2016-03-20 27 views
0

Bugüne kadar hiçbir zaman dize veya dize işlevleri kullanmamıştım ve anlamadığım bir sorunla karşılaşıyorum. Bu program olduğu gibi, bir komut satırı argümanını kabul etmeli, dosyayı yüklemeli ve belleğe göstermelidir. Bununla birlikte, birden çok kez görüntüler. Oldukça eminim ki, for döngüsü problemdir, fakat kullandığım programlama referansında kullanılanla aynı tekniktir.Döngü tekrarı için istenen eşleşme sayısı istenenden daha fazla yineleniyor

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

char* getFile(char* fileName){ 
    std::fstream inFile(fileName); 
    if(!inFile) std::cout << "Could not open " << fileName << ".\n"; 
    else{ 
     inFile.seekg(0,inFile.end); 
     int len = inFile.tellg(); 
     inFile.seekg(0,inFile.beg); 
     char* buffer = new char[len]; 
     inFile.read(buffer, len); 
     inFile.close(); 
     std::cout.write(buffer,len); 
     return buffer; 
     } 

    } 
int main(int argc, char** argv){ 
    if(argc != 2) std::cout << "Parameter required\n"; 
    else{ 
     std::string f = getFile(argv[1]); 
     for(size_t i = f.find(0x0A, 0); i != std::string::npos ; i = f.find(0x0A, i)){ 
      std::cout << f.substr(0,i)<<std::endl; 
      i++; 
      } 
    } 
} 

Kodumdaki sorunlardan en az birini görüyorum. Döngüyü bir döngü olarak tekrar yazdım çünkü takip edip durduğum yere biraz daha dikkat ettim ve takip ettim. Ancak yine de iki kez baskı yapıyor gibi görünüyor.

int main(int argc, char** argv){ 
    if(argc != 2) std::cout << "Parameter required\n"; 
    else{ 
     std::string f = getFile(argv[1]); 
     size_t start = 0; 
     size_t end = 1; 
     while(end != std::string::npos){ 
      end = f.find(0x0A, start); 
      std::cout << f.substr(start,end)<<std::endl; 
      start = (end + 1); 
      } 
+0

ben bu başarmak ++ olmaz:

std::cout.write(buffer,len); 

ikincisi şudur:

ilk baskı deyimi

biri mi? – mreff555

+0

Neye ulaşmaya çalışıyorsunuz? Yeni satır karakterinin konumuna göre dizgeyi f ayırın? Ve her parçayı yeni bir satıra yazdırmak mı? –

+0

Evet. Kod, dosyayı defalarca yazdırdığı gibi çalışır. Sürekli bir döngü değil ama birkaç kez. – mreff555

cevap

1

Bunun nedeni, dosyanın içeriğini görüntüleyen iki yazdırma ifadesine sahip olmanızdır.

std::cout << f.substr(0,i)<<std::endl; 
İlgili konular