Frage

So der Lehrer hat sich diese Aufgabe gestellt:

Sie wurden von der United Network Befehl für Law Enforcement angestellt, und Sie haben eine bestimmte Datei gewesen null Chiffren enthält, die Sie haben zu entschlüsseln.

So für die erste Datei angegeben (als Beispiel), alle anderen Buchstaben korrekt ist (dh: ‚hielqlpo‘ ist hallo (vorausgesetzt, Sie mit dem ersten Buchstaben beginnen) Meine erste Frage ist, wie kann ich in einer Datei lesen. ? das Dokument ist auf meinem Desktop in einem Ordner und die Datei document01.cry gestattet. ich bin nicht sicher, ob der Befehl muß ich diese Datei in das Programm gesetzt.

Ich bin auch nicht allzu sicher, wie ein Brief greifen und einen Brief überspringen, aber ehrlich gesagt mag ich damit basteln, bevor ich diese Frage posten! So jetzt ... meine Frage im Titel wie gesagt: Wie packen Sie eine Datei für in C ++ lesen?

Wenn es einen Unterschied macht (wie ich bin sicher, dass es der Fall ist), ich bin mit Visual C ++ 2008 Express Edition (weil es ist kostenlos und es gefällt mir! Ich habe auch angebracht, was ich bisher haben, bitte halten es ist etwas dagegen -very- Grund ... und ich hinzugefügt, um die getchar(); am Ende so, wenn er richtig ausgeführt wird, bleibt das Fenster offen, so kann ich es sehen (zum Beispiel Visual Express das Fenster so schnell zu schließen neigt, wie es läuft getan hat.)

Der Code so weit:

#include<iostream>

using namespace std;

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

PS: Ich weiß, dass dieser Code Greifer und jedes Zeichen löscht. Vorerst das ist in Ordnung, wenn ich denke, ich lesen kann in der Datei, die ich mit ihm von dort basteln kann. Ich bin Stossen auch an einem Buch oder zwei, die ich auf C ++ haben, um zu sehen es etwas erscheint und schreit „Pick me!“ Nochmals vielen Dank!

EDIT :: Auch neugierig, ist es eine Möglichkeit, die Datei, die Sie eingeben möchten? (Das heißt:.

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);

Dieser Code funktioniert nicht. Er schießt zurück einen Fehler das Zeichen sagen kann nicht * auf ein const char umgewandelt werden. Wie kann dieses Problem behoben werden?

EDIT 2: Geschweige denn um den Teil 2, fand ich es heraus! Nochmals vielen Dank für die Hilfe!

War es hilfreich?

Lösung 5

ich es herausgefunden! Um ehrlich zu sein niemand Antwort geholfen, es war eine Kombination der drei, plus die Kommentare von ihnen. Vielen Dank ihnen allen! Ich habe den Code angebracht ich verwenden, sowie eine Kopie des Dokuments. Das Programm liest in jedem Zeichen, spuckt dann den entschlüsselten Text aus. . (IE: 1h.e0l / lqo ist hallo) Der nächste Schritt (extra Kredit) ist es so einzurichten, die Benutzereingaben, wie viele Zeichen, bevor sie in das nächste Zeichen einzugeben Lesen überspringen

Dieser Schritt beabsichtige ich, auf eigene Faust zu tun, aber wieder, vielen Dank für all die Unterstützung jeder! Wieder einmal beweist, wie genial diese Seite ist, eine Zeile Code zu einer Zeit!

EDIT ::-Code angepasst Benutzereingaben zu übernehmen, sowie für verschiedene Zwecke verwendet werden kann, ohne neu zu kompilieren (Ich weiß, es wie ein riesiges schlampig Chaos aussieht, aber das ist, warum es sehr ... kommentiert wird, weil in meinem Kopf sieht es schön und neat)

#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 :::

Ich habe versucht, den Text eingefügt, aber ich konnte es nicht richtig herauskommen bekommen, hielt es wie Codierung einige der Charaktere Behandlung von (scheinbar dh ein Apostroph ist das Äquivalent des fett-Befehl), aber man konnte nur versuchen, Putting in „0h1e.l9lao“ ohne die Klammer in eine .txt und es sollte das gleiche Ergebnis geben.

Nochmals vielen Dank allen für die Hilfe!

Andere Tipps

Datei-Operationen zu tun, müssen Sie die richtigen sind:

#include <fstream>

Dann in Ihre Hauptfunktion können Sie einen Datei-Stream öffnen:

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

oder zur Ausgabe:

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

Sie können dann mit inFile wie Sie cin verwenden würden, und outFile wie Sie cout verwenden würden. Um die Datei zu schließen, wenn Sie fertig sind:

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

[EDIT] gehören die Unterstützung für Befehlszeilenargumente [EDIT] Feste möglich Speicherverlust [EDIT], um einen fehlenden Verweis Fest

#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;
}

Sollte es tun. Wenn die Datei sehr groß ist, sollten Sie wahrscheinlich nicht die gesamte Datei in den Puffer geladen werden.

Auch wenn Ihr queston beantwortet wurde, zwei kleine Tipps: 1) Anstelle des Zählens x und y, um zu sehen, wenn Sie auf eine ungerade oder sogar Zeichen, das Sie folgendes tun:

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

% bedeutet im Wesentlichen 'Rest, wenn geteilt durch' so 11% 3 zwei ist. in der oben gibt es eine gerade oder ungerade.

2) Sie nur Unter der Annahme, benötigen sie auf Windows laufen:

system("pause");

wird das Fenster geöffnet bleiben, wenn seine Ausführung abgeschlossen, so dass Sie nicht die letzten getchar benötigen () Aufruf (Sie müssen möglicherweise für #include<Windows.h>, dass zu arbeiten).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top