Pergunta

Assim, o professor colocou esta tarefa:

Você foi contratado pelo Comando United Network for Law Enforcement, e que lhe foi dada arquivos contendo cifras nulos você tem que decifrar.

Assim, para o primeiro arquivo de dados (como exemplo), todas as outras letras está correta (ou seja: 'hielqlpo' é Olá (supondo que você comece com a primeira letra) Minha primeira pergunta é: como faço para ler em um arquivo. ? o documento está no meu desktop em uma pasta e o arquivo é chamado document01.cry. Eu não tenho certeza o comando eu preciso para colocar esse arquivo no programa.

Eu também sou não excessivamente certeza de como pegar uma letra e pular uma carta, mas honestamente eu quero mexer com isso antes de eu postar essa pergunta! Então, por agora ... a minha pergunta é como é indicado no título: Como você pegar um arquivo para leitura em C ++?

Se ele faz a diferença (como eu tenho certeza que ele faz), estou usando o Visual C ++ 2008 Express Edition (porque é livre e eu gosto! Eu também tenho ligado o que eu tenho até agora, tenha em importa é -very- básica ... e eu adicionei o getchar(); no final para que quando ele for executado corretamente, as estadias janela aberta para que eu possa vê-lo (como Visual expresso tende a fechar a janela assim que ele é feito em execução.)

O código até agora:

#include<iostream>

using namespace std;

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

PS: Sei que esta disputa de código e coloca a cada personagem. Por agora do que bem, uma vez que pode ler no arquivo acho que posso mexer com ela de lá. Eu também estou cutucando um livro ou dois que eu tenho em C ++ para vê-lo qualquer coisa aparece e grita "Pick me!" Obrigado mais uma vez!

EDIT :: Também curioso, se existe uma maneira para inserir o arquivo que você deseja? (Ou seja:.

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

Este código não funciona. Ele atira de volta um erro dizendo que o caractere não pode ser convertido para um const char *. Como esse problema pode ser corrigido?

EDIT 2: Não se preocupe com a dita parte 2, eu encontrei-o para fora! Obrigado novamente para a assistência!

Foi útil?

Solução 5

Eu percebi isso! Para ser honesto há uma resposta ajudou, foi uma combinação dos três, mais os comentários a partir deles. Muito obrigado a todos! Anexei o código que eu usei, bem como uma cópia do documento. O programa lê em cada personagem, em seguida, cospe o texto decifrado. (IE: 1h.e0l / lqo é Olá). O próximo passo (crédito extra) é configurá-lo para as entradas do usuário quantos caracteres para pular antes de ler no próximo personagem a entrada

Esta etapa que pretendo fazer em meu próprio, mas mais uma vez, muito obrigado por toda a assistência a todos! Provando mais uma vez o quão incrível este site é, uma linha de código de cada vez!

EDIT :: Código ajustado para aceitar a entrada do usuário, bem como permitir usos múltiplos sem recompilar (Sei que parece uma enorme confusão desleixada, mas é por isso que é extremamente comentado ... porque em minha mente parece bom e puro)

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

Eu tentei inserir o texto, mas eu não poderia fazê-lo dar certo, ele manteve o tratamento de alguns dos personagens como codificação (ou seja, um apóstrofo, aparentemente, é o equivalente do comando negrito), mas você poderia simplesmente tentar colocar em "0h1e.l9lao" sem o parêntese em um .txt e deve dar o mesmo resultado.

Mais uma vez obrigado a todos pela ajuda!

Outras dicas

Para fazer operações de arquivo, é necessário o correto incluem:

#include <fstream>

Então, em sua função principal, você pode abrir um fluxo de arquivo:

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

ou, para a saída:

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

Você pode então usar INFILE como você poderia usar cin, e outFile como você poderia usar cout. Para fechar o arquivo quando você está feito:

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

[EDIT] incluem suporte para argumentos de linha de comando [EDIT] Corrigido um possível vazamento de memória [EDIT] Corrigido um falta de referência

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

Deve fazer o truque. Se o arquivo for muito grande, você provavelmente não deve carregar o arquivo inteiro no buffer.

Embora o seu queston foi respondida, duas pequenas dicas: 1) Em vez de contar x e y para ver se você estiver em um personagem estranho ou até mesmo você pode fazer o seguinte:

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

'restante quando dividido por,' % significa essencialmente tão 11% 3 é dois. no exemplo acima dá par ou ímpar.

2) Supondo que você só precisa executá-lo no Windows:

system("pause");

fará com que a estadia janela aberta quando a sua execução terminou, assim você não precisa o último getchar () chamada (você pode ter que #include<Windows.h> para que isso funcione).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top