2014-03-03 49 views
-2

我有兩個問題, 第二個文件n_cartelle_mod.txt沒有完全從n_cartelle.txt更改爲 ,第二個問題是賦值nomi_txt [cont] = n_cartelle [i] 爲什麼? 問題出在哪裏是substr,什麼時候找到一個txt文件,並且在這個任務之後。錯誤由兩個向量分配?

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

using namespace std; 

int main(int argc, char** argv) { 
    string arg = argv[2];      
    int arch;         
    string cambia ="cd "; 
    string cartella = argv[1];     

    vector <string> n_cartelle; 
    vector <string> nomi_txt; 
    int cont = 0; 


    //start code 

    if(argc == 3) { 

     cambia += cartella.substr(); 
     cambia += " && dir > n_cartelle.txt"; 

     const char * c_cambia = cambia.c_str(); 


     arch = system(c_cambia); 
     if(arch == 0) 
      cout << "\n Cartella cambiata con successo"<<endl 
       <<"\n Documento di testo con nome e tipo di file creato con successo"<<endl; 
     else{ 

      cout << "\nErrore nella chiamata a SYSTEM"<<endl; 
      exit(EXIT_FAILURE); 
     } 

     //decifro il file creato: 

     //prendo le stringhe dal file----------------------------------------------- 


     ifstream in("n_cartelle.txt"); 
     ofstream out("n_cartelle_mod.txt"); 
     string linea; 

     while(getline(in,linea)){ 

      if(linea.size() < 2) 
       out << "0000000000000000000000000000000000000000000000000\n"; 
      else 
       out << linea<<"\n"; 

      //n_cartelle.push_back(linea); 
     } 
     cout << "File creato e modificato, vado avanti\n"; 

     string linea2; 
     ifstream in2("n_cartelle_mod.txt"); 
     while(getline(in2,linea2)) 
      n_cartelle.push_back(linea2); 

     cout << "Caricato il <vector>\n"; 

     //-------------------------END------------------------------------------- 


     //problem is here 

     for(int i=0; i < n_cartelle.size()-4; ++i){ 

      cout <<"i volte: "<<i<<endl; 

      if(n_cartelle[i].substr(n_cartelle[i].size()-3) == "txt"){ 
       cout << "capperi\n"; 

       nomi_txt[cont] = n_cartelle[i]; 


       cont++; 
      } 


     } 



    } 


    else { 
     cout << "Parametri inesatti.\n\n"  
      << "Esempio di utilizzo:\n  Search.exe c:\\\\User paolo"<<endl; 

    } 
+0

另一個問題是,一些代碼丟失... – abiessu

回答

1
nomi_txt[cont] = n_cartelle[i]; 

既然你從未設置的nomi_txt大小,這會導致不確定的行爲,你將訪問了向量的界限的元素。如果你想nomi_txt有相同數量的元素n_cartelle,你需要調整它:

循環
nomi_txt.resize(n_cartelle.size()); 

之前。

Barmar已經提到在重新打開輸入文件之前關閉std::ofstream的問題。出現

2

您需要先關閉out然後再做ifstream in2("n_cartelle_mod.txt");。輸出到文件在默認情況下被緩衝,最後一個輸出塊將不會被刷新到文件中,直到您執行此操作。

或者您可以在您的out <<行中使用endl而不是"\n";這會輸出一個換行符並且還會刷新緩衝區。

0

的一個問題是,在n_cartelle最後2矢量項由for循環跳過:

for(int i=0; i < n_cartelle.size()-4; ++i) { 

而且,我相信nomi_text應使用.push_back或相似的功能元素添加到它,而而不是對可能不存在的索引進行索引分配。

0

您,是因爲矢量nomi_txt是空代替這種說法

nomi_txt[cont] = n_cartelle[i]; 

nomi_txt.push_back(n_cartelle[i]); 

,你可以不使用下標運算符來訪問不存在的元素。