2009-03-07 6 views
2

교사가이 과제를 제기했습니다.C++로 파일을 어떻게 얻습니까?

법 집행을 위해 유나이티드 네트워크 사령부 (United Network Command)에서 고용되었으므로 해독해야하는 null 암호가 포함 된 파일이 제공되었습니다.

예를 들어 첫 번째 파일의 경우 다른 모든 문자는 정확합니다 (예 : 'hielqlpo'는 안녕하세요 (첫 번째 문자로 시작한다고 가정). 첫 번째 질문은 file? 문서가 폴더의 바탕 화면에 있고 파일의 이름이 document01.cry 인 경우 해당 파일을 프로그램에 넣어야하는 명령이 확실하지 않습니다.

편지를 빼고 편지를 건너 뛰지 만, 솔직히 나는 그 질문을 게시하기 전에 그 문제를 해결하고 싶습니다! 지금 당장 ... 내 질문은 제목에 명시된 바와 같습니다 : C++에서 읽기 위해 파일을 어떻게 움켜 잡는가?

차이가 있다면 (확실하니) Visual C + + 2008 Express Edition (무료이기 때문에 좋아요!) 나는 또한 내가 지금까지 가지고있는 것을 첨부 했으니, 그것이 아주 기본이라는 것을 명심해라. 그리고 내가 결국 getchar();을 추가했다. 그래서 그것이 제대로 실행될 때, 나는 그것을 볼 수 있도록 창을 열어 둔다. (Visual 익스프레스는 실행이 이루어집니다 즉시 창을 닫습니다 경향이있다)

지금까지 코드 :.

#include<iostream> 

using namespace std; 

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

PS를 :이 코드를 잡고는 모든 문자를두고 있음을 알고 있습니다. 일단 괜찮 으면 파일에서 읽을 수있게되면 거기에서 그 파일을 수정할 수 있다고 생각합니다. 나는 또한 책을 찌르거나 두 사람이 C++을 사용하여 무엇이든 나타나는지보고 "나를 잡아라!"라고 외쳐야합니다. 다시 한 번 감사드립니다!

EDIT :: 또한 궁금한 점이 있나요? 원하는 파일을 입력 할 수있는 방법이 있습니까? (예 :..

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

이 코드는 작동하지 않습니다 그것은 CONST의 char *로 변환 할 수없는 문자를 말하는 오류를 다시 촬영하는 방법이 문제가 해결 될 수

편집 2? :!, 나는 그것을 부분이 발견 특징에 대해 신경 쓰지 덕분에 다시 지원을

답변

1

나는 그것을 알아 냈다! 솔직히 말해서 아무도 대답하지 못했습니다. 세 사람의 조합과 그에 대한 설명이었습니다. 정말 고마워요! 필자가 사용한 코드와 문서 사본을 첨부했습니다. 프로그램은 모든 문자를 읽은 다음 해독 된 텍스트를 출력합니다. (IE : 1h.e0l/lqo는 안녕하세요) 다음 단계 (추가 크레디트)는 사용자가 다음 문자를 읽기 전에 건너 뛰는 문자 수를 입력 할 수 있도록 설정하는 것입니다.

이 단계에서는 혼자 할 생각이지만, 도움의 손길을 보내 주셔서 감사합니다. 이 사이트가 얼마나 멋진 지 한번 다시 한 번에 한 줄씩 확인하십시오!

EDIT :: 코드는 사용자 입력을 받아들이도록 조정되었고, 다시 컴파일하지 않고 여러 번 사용할 수 있습니다 (나는 거대한 엉성한 엉망처럼 보였습니다. 그러나 그 이유는 아주 심오합니다 ... 왜냐하면 내 마음이 멋지 기 때문입니다.) 등) 깔끔한

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

편집 :::

내가 텍스트를 삽입하는 시도,하지만 난 그게 바로 나올 수 없었다, 그것은 코딩과 같은 일부 문자를 치료 유지

(즉, 아포스트로피 분명히 대담한 명령과 동일합니다.)하지만 .txt에 괄호없이 "0h1e.l9lao"를 넣을 수는 있습니다. 그러면 동일한 outc를 제공해야합니다 오메.

다시 도움을 청하십시오!

+0

"goto"문없이 이것을하는 것이 좋습니다. "goto"의 사용은 거의 절대 필요하지 않으며, 프로그램을 읽고, 디버그하고, 관리하기가 더 어렵습니다. goto 대신에 다른 루프를 사용하는 방법을 알아내는 것이 좋습니다. ("break"또는 "continue"키워드를 사용하고 싶을 수도 있습니다.) – Colin

+0

게시 후 몇 시간 후 goto 문에 대한 결정을 내렸지 만 대신 while 루프를 만들었습니다. 팁이 없으면 훨씬 깨끗하게 보입니다. – Jeff

+0

오류가 발생해도 eof에 도달하지 않을 수 있으므로 프로그램을 무한 루프에 넣기 때문에 istream에서 읽을 때 "! eof"를 루프의 조건으로 사용하지 마십시오. 게다가 스트림의 상태는 입력 조작 후 및 결과를 사용하기 전에 검사해야합니다. 프로그램의 경우 이것은'while (! infile.eof()) {infile.get (letter); ...'는'while (infile.get (letter)) {...로 대체되어야 함을 의미합니다. '. –

9

을 파일 작업을 수행하려면 올바른 포함해야

출력,

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

나 :

#include <fstream> 

그런 다음, 주요 기능, 당신은 파일 스트림을 열 수 있습니다

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

당신이 CIN을 사용 하듯이 그런 다음 INFILE를 사용할 수 있습니다, 및 outFile 당신이 사용하는 것처럼 cout. 작업이 완료 파일 닫으려면 :

inFile.close(); 
outFile.close(); 
+0

감사합니다. Niyaz가 게시 한 사이트에서도 파일이 폴더 (예 : C : \ Documents and Settings \ J \ Desktop \ College work \ CSIS 296 \ asst4 \ Documents)에 있으면 어떻게 될까요? 내가 시험하기 전에 부탁하고 있지만, "덧글 추가"를 누르 자마자 시험하고있다. – Jeff

+0

프로그램의 .cpp 파일과 같은 폴더에있는 경우 "filename.txt"를 사용하면 알 수 있지만 다른 파일에 있으면 어떻게됩니까? \ MYFILE.TXT 그리고 그 인수가 – Jeff

+0

혼란을 보였다 말한 경우 그게 무슨 뜻인지 이해가 안되요, 조금 더 설명해 주시겠습니까? – Scott

3

가 [편집] 명령 줄 인수에 대한 지원을 포함을 [편집] 고정 가능한 메모리 누수 [편집] 고정

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

이해야 누락 된 참조 속임수.파일이 매우 큰 경우 전체 파일을 버퍼로로드하지 않아야합니다.

+0

굉장합니다! 고맙습니다! : D 그러나 여전히 같은 디렉토리에있는 파일에 의존합니다. 파일이 다른 디렉토리에 있다면 어떻게 될까요? – Jeff

+0

이제 명령 줄 인수와 여러 파일을 읽을 수 있습니다. foobar.exe myfile.txt myfile1.txt myfile2.txt – Scott

+0

예, 사실 정말로 멋지지만, 지금까지 제가 수업에서 배운 것 이상일 수 있습니다. 나는 그것이 실제로 멋지게 보이고 프로세스 (약간)를 만들 수 있기 때문에, 나는 그것의 많은 것을 이해하지 못하기 때문에 그렇게 말하고있다. 나는 이해가 부족하다는 것을 가리키며 시작해야 할 부분이 어디인지 모르겠다. – Jeff

1

당신의 queston가 대답되었지만, 두 개의 작은 팁 : 기본적으로

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

% : 당신은 홀수 또는 짝수 문자가 당신이 할 수있는 다음에있는 경우 1) 대신 x와 y를 계산의보고 '나눌 때 나머지'를 의미하므로 11 % 3은 2입니다. 위의 경우 그것은 이상하거나 균등하게 나타납니다. 당신은 윈도우에서 실행해야하는 가정

2) : 그것 때문에 당신이() 호출을 마지막 getchar가 필요하지 않은 실행이 완료되면

system("pause"); 

창이 열려있을 것 (당신은 할 수 있습니다 그게 작동하려면 #include<Windows.h>).

+0

그 시스템 일시 중지 명령이 슬프게도 훌륭하지만 비주얼 C++ 익스프레스를 사용하는 동안 선생님이 buffy (또는 무엇이라도 부르면 어떤 형태의 리눅스 이건간에)를 사용하고 있기 때문에 내가 할 수 있다고 생각하지 않습니다. 진정으로 프로그램에 기반한 Windows를 사용하십시오. – Jeff

+0

그러나 그 나머지 2 가지는 꽤 깔끔하고, 나는 이것을 염두에 두겠습니다! 나는이 프로그램을 조정 해왔다. 지금은 재 컴파일하지 않고 여러 파일을 처리 할 수있는 곳을 설정했다. 현재는 해독 할뿐만 아니라 암호화하는 작업을하고있다. 생각하는 까다로운 부분이 될 것이다! – Jeff

+0

아, 그냥 무작위로 생각했는데 나머지는 효과가 없을 것이라고 생각합니다. 나의 예는 다른 모든 성격을 보여 주지만, 그것은 단지 하나의 부분 일 뿐이며, 다른 수 (IE는 매 537 번째 글자가 좋다)를 위해 일할 수 있어야하고, 현재의 설정은 내가 조정할 수있게한다. 나는 그렇지 않다고 생각한다. 그것? – Jeff

관련 문제