Вопрос
Итак, учитель поставил это задание:
Вы были наняты Объединенным сетевым командованием для обеспечения правопорядка, и вам были предоставлены файлы, содержащие нулевые шифры, которые вы должны расшифровать.
Таким образом, для первого приведенного файла (в качестве примера) все остальные буквы верны (т.е.:"hielqlpo" - это привет (при условии, что вы начинаете с первой буквы).Мой первый вопрос заключается в том, как мне читать в файле?Документ находится на моем рабочем столе в папке, и файл называется document01.cry.Я не уверен, какая команда мне нужна, чтобы поместить этот файл в программу.
Я также не совсем уверен, как захватить письмо и пропустить его, но, честно говоря, я хочу повозиться с этим, прежде чем публиковать этот вопрос!Итак, для now...my вопрос заключается в том, как указано в названии:Как получить файл для чтения на 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 ++, чтобы увидеть, что что-нибудь всплывает и кричит "Выбери меня!" Еще раз спасибо!
Редактировать::Также любопытно, есть ли способ ввести нужный вам файл?(Тоесть.:
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);
Этот код не работает.Он выдает ошибку, в которой говорится, что char не может быть преобразован в const char *.Как можно устранить эту проблему?
ПРАВКА 2:Не обращайте внимания на упомянутую часть 2, я это выяснил!Еще раз спасибо за помощь!
Решение 5
Я все понял!Честно говоря, ни один ответ не помог, это была комбинация из трех, плюс комментарии от них.Большое вам всем спасибо!Я приложил код, который использовал, а также копию документа.Программа считывает каждый символ, затем выплевывает расшифрованный текст.(Т.Е.:1ч.e0l / lqo - это привет) Следующий шаг (дополнительный кредит) - настроить его таким образом, чтобы пользователь вводил, сколько символов нужно пропустить, прежде чем читать следующий вводимый символ.
Этот шаг я намерен сделать самостоятельно, но еще раз, всем огромное спасибо за оказанную помощь!Еще раз доказывая, насколько потрясающий этот сайт, по одной строке кода за раз!
Редактировать::Код скорректирован так, чтобы принимать вводимые пользователем данные, а также допускать многократное использование без перекомпиляции (я понимаю, что это выглядит как огромный неаккуратный беспорядок, но именно поэтому он ТАК комментируется ... потому что, на мой взгляд, это выглядит красиво и аккуратненько)
#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.
}
Редактировать:::
Я попытался вставить текст, но у меня не получилось, чтобы он получился правильно, он продолжал обрабатывать некоторые символы как кодировку (т. Е. апостроф, по-видимому, является эквивалентом команды bold), но вы могли бы просто попробовать вставить "0h1e.l9lao" без круглых скобок в .txt, и это должно дать тот же результат.
Еще раз спасибо всем за помощь!
Другие советы
Чтобы выполнить файловые операции, вам нужно правильно включить:
#include <fstream>
Затем в своей основной функции вы можете открыть поток файлов:
ifstream inFile( "filename.txt", ios::in );
или для вывода:
ofstream outFile( "filename.txt", ios::out );
Затем вы можете использовать inFile, как если бы вы использовали cin, и outFile, как если бы вы использовали cout. Чтобы закрыть файл, когда вы закончите:
inFile.close();
outFile.close();
[ПРАВИТЬ] включить поддержку аргументов командной строки [ПРАВИТЬ] Исправлена возможная утечка памяти [ПРАВИТЬ] Исправлена отсутствующая ссылка
#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;
}
Должно сработать.Если файл очень большой, вам, вероятно, не следует загружать весь файл в буфер.
Хотя на ваш квестон дан ответ, два небольших совета: 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>
, чтобы это сработало).