2014-03-03 1 views
-2

두 가지 문제가 있습니다. 두 번째 파일 인 n_cartelle_mod.txt가 n_cartelle.txt 에서 완전히 변경되지 않았으며 두 번째 문제가 할당 nomi_txt [cont] = n_cartelle [i] 인 이유는 무엇입니까? 문제는 where가 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_txtn_cartelle 같은 수의 요소를 가지고 싶다면, 당신은 크기를 조정해야합니다

nomi_txt.resize(n_cartelle.size()); 

전에 루프에.

Barmar 이미 입력을 위해 파일을 다시 열기 전에 std::ofstream을 닫는 문제를 언급했습니다. 표시

2

당신은 당신이 ifstream in2("n_cartelle_mod.txt");을하기 전에 out을 닫아야합니다. 파일로의 출력은 기본적으로 버퍼링되며, 이렇게 할 때까지 출력의 마지막 블록은 파일로 플러시되지 않습니다.

out << 행에 "\n" 대신 endl을 사용할 수도 있습니다. 이것은 개행을 출력하고 버퍼를 플러시합니다. 당신이 nomi_txt의 크기를 설정하지 때문에 당신이 벡터의 경계 밖으로 요소에 접근 될 것이다

0

하나의 문제가 n_cartelle의 마지막 2 개 벡터 항목이 for 루프에 의해 생략되어 있다는 점이다 : 또한

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

, 나는 nomi_text 오히려 그것에 요소를 추가 할 .push_back 또는 유사한 기능을 사용한다고 생각 인덱스가 이미 존재하지 않을 수도 있습니다.

0

당신은 벡터 nomi_txt 비어 있기 때문에

nomi_txt.push_back(n_cartelle[i]); 

이 문

nomi_txt[cont] = n_cartelle[i]; 

을 대체해야하고 당신이 존재하지 않는 요소에 액세스 할 수 첨자 연산자를 사용하지 않을 수 있습니다.

관련 문제