Pregunta

Esto se refiere a otra pregunta que hice, aunque es su propia pregunta en su totalidad.

cuando compilo obtengo dos errores:

1 >. \ asst4.cpp (73): error C2065: 'outfile': identificador no declarado

1 >. \ asst4.cpp (73): error C2228: a la izquierda de '.close' debe tener clase / estructura / unión

Estoy un poco confundido en cuanto a lo que he hecho incorrectamente aquí? ¿Alguna recomendación o ideas? (El archivo de salida real está cerca de la parte superior del código.

Aquí está el código completo:

#include<iostream>
#include<fstream>  //used for reading/writing to files.
#include<string>    //needed for the filename.
#include<stdio.h>   //for goto statement

using namespace std;

int main()
{
    string start;
    char choice;
    char letter;
    int x;
    int y;
    int z;
    string filename;
    int garbage = rand()%('!' - '~' + 1 );
    cout << "Would you like to encrypt or decrypt a file? Please type enc, dec, or stop (case sensitive): " ;
    cin >> start;
    while(start == "enc")
    {
        x = 1;
        y = 1;
        cout << "How many garbage characters would you like between each correct character?: " ;
        cin >> z;
        cout << endl << "Please insert the name of the document you wish to encrypt, make sure you enter the name, and the file type (ie: filename.txt): " ;
        cin >> filename;
        ifstream infile(filename.c_str());
        while(!infile.eof())
        {
            ofstream outfile("encrypted.txt", ios::out);
            infile.get(letter); 
            if (x == y)         
                {
                outfile << garbage;
                x++;             
            }
            else
            {
                if((x - y) == z)            
                {
                    outfile << letter;          
                    y = x;                  
                }
                else                        
                {                           
                    outfile << garbage;
                    x++;
                }
            }
        }
        cout << endl << "Encryption complete...please return to directory of program, a new file named encrypted.txt will be there." << endl;
        infile.close();
        outfile.close();
        cout << "Do you wish to try again? Please press y then enter if yes (case sensitive).";
        cin >> choice;
        if(choice == 'y')
        {
            start = "enc";
        }
        else
        {
            cout << endl << "Do you wish to decrypt a file? Please press y then enter if yes (case sensitive).";
            if(choice = 'y')
            {
                start == "dec";
            }
            else
            {
                start == "no";
            }
        }
    }
    while(start == "dec")
    {

      //lets user choose whether to do another document or not.
      //used to track each character in the document.
        x = 1;    //first counter for tracking correct letter.
        y = 1;    //second counter (1 is used instead of 0 for ease of reading, 1 being the "first character").
              //third counter (used as a check to see if the first two counters are equal).
        //allows for user to input the filename they wish to use.
        cout << "Please make sure the document is in the same file as the program, thank you!" << endl << "Please input document name: " ;
        cin >> filename; //getline(cin, filename);  
        cout << endl;
        cout << "'Every nth character is good', what number is n?: ";
        cin >> z;   //user inputs the number at which the character is good. IE: every 5th character is good, they would input 5.
        cout << endl;
        z = z - 1;  //by subtracting 1, you now have the number of characters you will be skipping, the one after those is the letter you want.
        ifstream infile(filename.c_str()); //gets the filename provided, see below for incorrect input.
        if(infile.is_open()) //checks to see if the file is opened.
        {
            while(!infile.eof())    //continues looping until the end of the file.
            {   
                    infile.get(letter);  //gets the letters in the order that that they are in the file.
                    if (x == y)          //checks to see if the counters match...
                    {
                        x++;             //...if they do, adds 1 to the x counter.
                    }
                    else
                    {
                        if((x - y) == z)            //for every nth character that is good, x - y = nth - 1.
                        {
                            cout << letter;         //...if they don't, that means that character is one you want, so it prints that character.
                            y = x;                  //sets both counters equal to restart the process of counting.
                        }
                        else                        //only used when more than every other letter is garbage, continues adding 1 to the first
                        {                           //counter until the first and second counters are equal.
                            x++;
                        }
                    }
            }
            cout << endl << "Decryption complete...please return to directory of program, a new file named encrypted.txt will be there." << endl;
            infile.close();
            cout << "Do you wish to try again? Please press y then enter if yes (case sensitive).";
            cin >> choice;
            if(choice == 'y')
            {
                start == "dec";
            }
            else
                {
                cout << endl << "Do you wish to encrypt a file? Please press y then enter if yes (case sensitive).";
                if(choice == 'y')
                {
                    start == "enc";
                }
                else
                {
                    start == "no";
                }
            }
        }
        else  //this prints out and program is skipped in case an incorrect file name is used.
        {
            cout << "Unable to open file, please make sure the filename is correct and that you typed in the extension" << endl;
            cout << "IE:" << "     filename.txt" << endl;
            cout << "You input: " << filename << endl;
            cout << "Do you wish to try again? Please press y then enter if yes (case senstive)." ;
            cin >> choice;
            if(choice == 'y')
            {
                start == "dec";
            }
            else
            {
                start == "no";
            }
        }
        getchar();  //because I use visual C++ express.
    }
}

Gracias de antemano! Jeff

¿Fue útil?

Solución

Problema de alcance. Está declarando outfile dentro de su bucle while, pero está intentando acceder a él fuera de dicho bucle while.

Mueva del archivo outstream (" encrypted.txt " ;, ios :: out); a la línea que se encuentra justo después de su ifstream infile (filename.c_str ()); que está antes de su while (! infile.eof ()) .

Otros consejos

Tienes dos opciones: como menciona X-istence, la razón por la que no se compila su llamada a outfile.close () es porque el objeto 'outfile' no existe en el mismo ámbito que la declaración de outfile.

Puedes mover la línea


ofstream outfile("encrypted.txt", ios::out);

fuera del bucle while para que cumpla con las mismas reglas de alcance que infile, o puedes mover tu llamada a outfile.close (); dentro del bucle while, que lo movería al alcance actual en el que existe el archivo de salida.

Mi preferencia sería mover la declaración de outfile fuera del bucle while, ya que abrir un archivo es una operación bastante costosa y realmente no desea hacer esto por cada letra que lea del archivo. Ábralo una vez, ciérrelo una vez es el camino a seguir en este caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top