Question

Le professeur a donc posé cette tâche:

Vous avez été embauché par le United Network Command for Law Enforcement et des fichiers contenant des chiffres nuls que vous devez déchiffrer doivent être déchiffrés.

Donc pour le premier fichier donné (à titre d'exemple), une lettre sur deux est correcte (par exemple: "hielqlpo" est bonjour (en supposant que vous commenciez par la première lettre). Ma première question est de savoir comment lire dans un fichier. "Le document se trouve sur mon bureau dans un dossier et le fichier s'appelle document01.cry. Je ne suis pas sûr de la commande dont j'ai besoin pour mettre ce fichier dans le programme.

Je ne suis pas non plus trop sûr de savoir comment saisir une lettre et sauter une lettre, mais honnêtement, je veux bricoler avec cela avant de poster cette question! Donc pour le moment ... ma question est la suivante: Comment pouvez-vous saisir un fichier pour le lire en C ++?

Si cela fait une différence (comme je suis sûr que c'est le cas), j'utilise Visual C ++ 2008 Express Edition (car c'est gratuit et je l'aime! J'ai également joint ce que j'ai à ce jour, merci de garder attention, c’est - très basique ... et j’ajoute le getchar(); à la fin pour que, quand elle fonctionne correctement, la fenêtre reste ouverte pour que je puisse la voir (car Visual Express a tendance à fermer la fenêtre dès qu’elle est exécutée .)

Le code jusqu'à présent:

#include<iostream>

using namespace std;

int main()
{
    while (! cin.eof())
    {
        int c = cin.get() ;
        cout.put(c) ;
    }
    getchar();
}

PS: Je me rends compte que ce code saisit et met tous les caractères. Pour l'instant ça va, une fois que je peux lire dans le fichier, je pense pouvoir le bricoler à partir de là. Je suis aussi en train de fouiller dans un livre ou deux que j'ai sur C ++ pour voir quelque chose qui apparaît et crie & "Choisis-moi! &"; Merci encore!

EDIT :: Également curieux, existe-t-il un moyen de saisir le fichier souhaité? (I.e.:

char filename;
cout << "Please make sure the document is in the same file as the program, thank you!" << endl << "Please input document name: " ;
cin >> filename;
cout << endl;
ifstream infile(filename, ios::in);

Ce code ne fonctionne pas. Il renvoie une erreur en disant que le caractère ne peut pas être converti en un caractère constant *. Comment résoudre ce problème?

EDIT 2: Qu'à cela ne tienne, dit la deuxième partie, je l'ai découvert! Merci encore pour l'aide!

Était-ce utile?

La solution 5

Je l'ai compris! Pour être honnête, aucune réponse n’a aidé, c’était une combinaison des trois, plus leurs commentaires. Merci beaucoup à tous! J'ai joint le code que j'ai utilisé, ainsi qu'une copie du document. Le programme lit chaque caractère, puis recrache le texte déchiffré. (IE: 1h.e0l / lqo is hello) La prochaine étape (crédit supplémentaire) consiste à le configurer afin que l'utilisateur entre le nombre de caractères à ignorer avant de lire le prochain caractère à saisir.

Je compte faire ce pas tout seul, mais encore une fois, merci beaucoup pour votre aide à tous! Prouvez une fois de plus à quel point ce site est génial, une ligne de code à la fois!

EDIT :: Code ajusté pour accepter les entrées de l'utilisateur, ainsi que pour permettre plusieurs utilisations sans recompiler (je réalise que cela ressemble à un énorme gâchis, mais c'est pourquoi il est EXTRÊMEMENT commenté ... parce que dans mon esprit, ça a l'air sympa et soigné)

#include<iostream>
#include<fstream>   //used for reading/writing to files, ifstream could have been used, but used fstream for that 'just in case' feeling.
#include<string>    //needed for the filename.
#include<stdio.h>   //for goto statement

using namespace std;

int main()
{
    program:
    char choice;  //lets user choose whether to do another document or not.
    char letter;  //used to track each character in the document.
    int x = 1;    //first counter for tracking correct letter.
    int y = 1;    //second counter (1 is used instead of 0 for ease of reading, 1 being the "first character").
    int z;        //third counter (used as a check to see if the first two counters are equal).
    string filename;    //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...if unreadable, please check to see if your input key was correct then try again." << endl;
        infile.close();
        cout << "Do you wish to try again? Please press y then enter if yes (case senstive).";
        cin >> choice;
        if(choice == 'y')
        {
            goto program;
        }
    }
    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')
        {
            goto program;
        }
    }
    getchar();  //because I use visual C++ express.
}

EDIT :::

J'ai essayé d'insérer le texte, mais je ne pouvais pas le faire paraître correctement. Certains caractères étaient traités comme du code (c'est-à-dire qu'une apostrophe est apparemment l'équivalent de la commande en gras), mais vous pouvez simplement mettre dans " 0h1e.l9lao " sans la parenthèse dans un fichier .txt et il devrait donner le même résultat.

Merci encore à tous pour votre aide!

Autres conseils

Pour effectuer des opérations sur les fichiers, vous devez disposer du bon include:

#include <fstream>

Ensuite, dans votre fonction principale, vous pouvez ouvrir un flux de fichiers:

ifstream inFile( "filename.txt", ios::in );

ou, pour la sortie:

ofstream outFile( "filename.txt", ios::out );

Vous pouvez ensuite utiliser inFile comme vous utiliseriez cin et outFile comme vous utiliseriez cout. Pour fermer le fichier lorsque vous avez terminé:

inFile.close();
outFile.close();

[EDIT] inclut la prise en charge des arguments de ligne de commande [EDIT] Correction d'une fuite de mémoire possible [EDIT] Correction d'une référence manquante

#include <fstream>
#include <iostream>

using namespace std;

int main(int argc, char *argv){
    ifstream infh;  // our file stream
    char *buffer;

    for(int c = 1; c < argc; c++){
        infh.open(argv[c]);

        //Error out if the file is not open
        if(!infh){
            cerr << "Could not open file: "<< argv[c] << endl;
            continue;
        }

        //Get the length of the file 
        infh.seekg(0, ios::end);
        int length = infh.tellg();

        //reset the file pointer to the beginning
        is.seekg(0, ios::beg);

        //Create our buffer
        buffer = new char[length];

        // Read the entire file into the buffer
        infd.read(buffer, length);

        //Cycle through the buffer, outputting every other char
        for(int i=0; i < length; i+= 2){
            cout << buffer[i]; 
        }
        infh.close();
    }
    //Clean up
    delete[] buffer;
    return 0;
}

Devrait faire l'affaire. Si le fichier est extrêmement volumineux, vous ne devriez probablement pas charger tout le fichier dans la mémoire tampon.

Bien que votre question ait été répondue, deux petits conseils: 1) Au lieu de compter x et y pour voir si vous utilisez un caractère impair ou pair, vous pouvez procéder comme suit:

int count=0;
while(!infile.eof())
{       
    infile.get(letter);
    count++;
    if(count%2==0)
    {
        cout<<letter;
    }
}

% signifie essentiellement "reste lorsque divisé par", donc 11% 3 est égal à deux. dans ce qui précède, il donne impair ou pair.

2) En supposant que vous n’ayez besoin que de l’exécuter sur Windows:

system("pause");

fera en sorte que la fenêtre reste ouverte à la fin de son exécution afin que vous n'ayez plus besoin du dernier appel à getchar () (vous devrez peut-être #include<Windows.h> pour que cela fonctionne).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top