【问题标题】:Error to assignment by two vector?两个向量分配错误?
【发布时间】:2014-03-03 16:49:59
【问题描述】:

我有两个问题, 第二个文件 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;

    }

【问题讨论】:

  • 还有一个问题是缺少一些代码...

标签: c++ assign


【解决方案1】:

您需要先关闭out,然后再关闭ifstream in2("n_cartelle_mod.txt");。默认情况下,输出到文件是缓冲的,在您执行此操作之前,最后一个输出块不会刷新到文件中。

或者你可以在你的out &lt;&lt; 行中使用endl 而不是"\n";这会输出一个换行符并刷新缓冲区。

【讨论】:

    【解决方案2】:
    nomi_txt[cont] = n_cartelle[i];
    

    由于您从未设置nomi_txt 的大小,这将导致未定义的行为,因为您将访问向量边界之外的元素。如果您希望nomi_txtn_cartelle 具有相同数量的元素,则需要调整它的大小:

    nomi_txt.resize(n_cartelle.size());
    

    循环之前。

    Barmar 已经提到了在重新打开文件进行输入之前关闭std::ofstream 的问题。

    【讨论】:

      【解决方案3】:

      出现的一个问题是n_cartelle 中的最后两个向量项被for 循环跳过:

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

      此外,我认为nomi_text 应该使用.push_back 或类似的函数向其中添加元素,而不是对可能不存在的索引进行索引分配。

      【讨论】:

        【解决方案4】:

        您必须替换此语句

        nomi_txt[cont] = n_cartelle[i];
        

        nomi_txt.push_back( n_cartelle[i] );
        

        因为向量 nomi_txt 是空的,你不能使用下标运算符来访问不存在的元素。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          相关资源
          最近更新 更多