Как вы получаете файл в C ++? - PullRequest
2 голосов
/ 07 марта 2009

Итак, учитель поставил это задание:

Вы были наняты Объединенным сетевым командованием правоохранительных органов, и вам были переданы файлы, содержащие нулевые шифры, которые вы должны расшифровать.

Таким образом, для первого заданного файла (в качестве примера) каждая другая буква является правильной (то есть: «hielqlpo» - привет (при условии, что вы начинаете с первой буквы). Мой первый вопрос: как мне читать в файле? «Документ находится на моем рабочем столе в папке, и файл с именем document01.cry. Я не уверен, что команда мне нужна, чтобы поместить этот файл в программу.

Я также не слишком уверен, как захватить письмо и пропустить письмо, но, честно говоря, я хочу повозиться с этим, прежде чем отправлять этот вопрос! Итак, на данный момент ... мой вопрос, как указано в заголовке: Как вы получаете файл для чтения в C ++?

Если это что-то меняет (как я уверен, это так), я использую Visual C ++ 2008 Express Edition (потому что это бесплатно и мне это нравится! Я также приложил то, что у меня есть, пожалуйста, оставьте в имейте в виду, что это очень просто ... и я добавил getchar(); в конце, чтобы при правильном запуске окно оставалось открытым, чтобы я мог его видеть (поскольку Visual Express стремится закрыть окно, как только оно завершится, .)

Код пока:

#include<iostream>

using namespace std;

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

PS: я понимаю, что этот код захватывает и выводит каждый символ. На данный момент это нормально, как только я смогу прочитать файл, я думаю, что смогу с ним повозиться. Я также ковыряюсь в одной или двух моих книгах на C ++, чтобы увидеть, как что-то всплывает и кричит "Выбери меня!" Еще раз спасибо!

РЕДАКТИРОВАТЬ :: Также любопытно, есть ли способ ввести файл, который вы хотите? (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);

Этот код не работает. Он возвращает ошибку, сообщающую, что символ не может быть преобразован в постоянный символ *. Как можно решить эту проблему?

РЕДАКТИРОВАТЬ 2: Не берите в голову сказанную часть 2, я узнал это! Еще раз спасибо за помощь!

Ответы [ 5 ]

9 голосов
/ 07 марта 2009

Чтобы выполнить файловые операции, вам необходимо правильно включить:

#include <fstream>

Затем в основной функции вы можете открыть поток файлов:

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

или, для вывода:

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

Затем вы можете использовать inFile так же, как и cin, а outFile - как cout. Чтобы закрыть файл, когда вы закончите:

inFile.close();
outFile.close();
3 голосов
/ 07 марта 2009

[EDIT] включает поддержку аргументов командной строки [РЕДАКТИРОВАТЬ] Исправлена ​​возможная утечка памяти [РЕДАКТИРОВАТЬ] Исправлена ​​пропущенная ссылка

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

Должен сделать свое дело. Если файл очень большой, вам, вероятно, не следует загружать весь файл в буфер.

3 голосов
/ 07 марта 2009
1 голос
/ 07 марта 2009

Хотя на ваш квестон дан ответ, два маленьких совета: 1) Вместо того, чтобы считать x и y, чтобы увидеть, есть ли у вас нечетный или четный символ, вы можете сделать следующее:

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

% по существу означает «остаток при делении на», поэтому 11% 3 - это два. в приведенном выше он дает нечетное или четное.

2) Предполагается, что вам нужно запустить его только в Windows:

system("pause");

заставит окно оставаться открытым, когда оно завершит работу, поэтому вам не нужен последний вызов getchar () (вам может потребоваться #include<Windows.h>, чтобы это работало).

1 голос
/ 07 марта 2009

Я понял это! Если честно, ни один ответ не помог, это была комбинация из трех, плюс комментарии от них. Спасибо всем большое! Я приложил код, который я использовал, а также копию документа. Программа читает каждый символ, а затем выплевывает расшифрованный текст. (IE: 1h.e0l / lqo is hello) Следующий шаг (дополнительный кредит) состоит в том, чтобы установить его так, чтобы пользователь вводил количество пропускаемых символов перед прочтением следующего символа для ввода.

Этот шаг я собираюсь сделать самостоятельно, но еще раз, большое спасибо всем за помощь! Еще раз доказывая, насколько классен этот сайт, одна строка кода за раз!

РЕДАКТИРОВАТЬ :: Код настроен так, чтобы принимать пользовательский ввод, а также разрешать многократное использование без перекомпиляции (я понимаю, что это выглядит как огромный неаккуратный беспорядок, но именно поэтому это ОЧЕНЬ прокомментировано ... потому что, на мой взгляд, это выглядит красиво и неразбавленный)

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

Я пытался вставить текст, но я не мог заставить его выйти правильно, он продолжал обрабатывать некоторые символы как кодирование (то есть апостроф, по-видимому, является эквивалентом команды жирным шрифтом), но вы могли бы просто попробовать поставить в «0h1e.l9lao» без круглых скобок в .txt, и это должно дать тот же результат.

Еще раз спасибо всем за помощь!

...