예외 C ++에 대해 try-catch 블록을 사용하여 파일에서 행 읽기

user3765713

특정 길이의 줄을 읽고 구문 분석하고 싶습니다. 그들을 구문 분석하기 위해 예외를 사용하여 특정 잘못된 입력을 처리하지만 오류가 발생할 때마다 버퍼가 잘못된 입력으로 채워지고 다음 getline 명령은 파일에 여전히 유효한 입력이 있어도 그 안에 횡설수설을 넣습니다.

내 코드는 다음과 같습니다.

( 파일이 유효하지 않은 경우 읽은 inStream유형 istream이므로 cin)

char buffer[MAX_LINE_LENGTH];
string line;
while (inStream.getline(buffer,MAX_LINE_LENGTH)) {
    line=string(buffer);

    try {
        parse(line, inStream, outStream);
    }

    catch(const DoneError& e){
        outStream<<e.what();
        return 0;
    }

    catch(const MyException& e) {
        outStream<<e.what();
    }

    //invalid_argument or out_of_range at stod & stoi
    catch (const logic_error& e)    {
        outStream<<BadParameterExeption().what();
    }

    catch(const exception& e){
        outStream<<e.what();
    }
}

처음으로 parse(이미 catch 블록에 있음) 예외 buffer가 원래 내용이 buffer아닌 정크로 채워지고 루프의 다음 반복도 입력이 아닌 정크로 채워집니다 . 나는 catch 블록을 사용 clear()하고 시도했지만 ignore(MAX_LINE_LENGTH, '\n')도움이되지 않았습니다. 어떡해? MAX_LINE_LENGTH 문자를 기껏해야 읽고 한 줄에 그 이상을 얻으면 다음 반복에서 읽을 수 있습니다.

리디렉션이 아닌 파일에서 읽었습니다. 방법은 다음과 같습니다.

ifstream  inpFile;
ofstream outFile;

/* I receive the files' names via argv, some are input some are output
 * (order is fixed but not the number)
 * /.prog outpu1 input1 output2 input2 (and so on)
 * degenerated example on how It works:
 *    for(int i=argc-1; i>0; i-=2){
 *       inpFile.open(argv[i]);
 *       if(inpFile.is_open()) return true;
 *    }
 */
if (!initFiles (argc, argv, inpFile, outFile))
    return 1;

istream &inStream = (inpFile.is_open()) ? inpFile : cin;
ostream &outStream = (outFile.is_open()) ? outFile : cout;
P. 힌커

더 많은 정보를 제공해야합니다. 다음은 Fedora에서 g ++ 5.1.1로 컴파일 할 때 잘 작동합니다. 분명히, 나는 그것을 컴파일하고 실행하기 위해 누락 된 인프라의 일부를 만들어야했지만 너무 많은 자유를 취했다고 생각하지 않습니다.

#include <iostream>
#include <fstream>
#include <exception>
#include <stdexcept>
#include <string>

using namespace std;

#define min(x, y) (x < y) ? x : y

const int MAX_LINE_LENGTH = 80;

struct DoneError : public exception
{
   const char *what() const throw()
   {
      return "Done Exception";
   }
};

struct MyException : public exception
{
   const char *what() const throw()
   {
      return "MyException";
   }
};

struct BadParameterExeption : public exception
{
   const char *what() const throw()
   {
      return "Bad Parameter";
   }
};

void parse(string l, istream &is, ostream &os)
{
   if (l.find("MyException") != string::npos)
      throw MyException();

   if (l.find("Done") != string::npos)
      throw DoneError();

   if (l.find("logic") != string::npos)
      throw logic_error("You made a logic error");

   if (l.find("BadParameter") != string::npos)
      throw BadParameterExeption();
}


int main(int argc, char **argv)
{
   ifstream inpFile(argv[1]);
   ofstream outFile(argv[2]);

   istream &inStream = (inpFile.is_open()) ? inpFile : cin;
   ostream &outStream = (outFile.is_open()) ? outFile : cout;

   char buffer[MAX_LINE_LENGTH];
   string line;
   try {
      while (getline(inStream, line, '\n'))
      {
          while (line.length() > 0)
          {
             string smaller = line.substr(0, min(MAX_LINE_LENGTH, line.length()));
             line = line.substr(min(MAX_LINE_LENGTH, line.length()));
             try {
                 parse(smaller, inStream, outStream);
             }

          catch(const DoneError& e){
              outStream<<e.what()<<endl;;
              return 0;
          }

          catch(const MyException& e) {
              outStream<<e.what()<<endl;;
          }

    //invalid_argument or out_of_range at stod & stoi
          catch (const logic_error& e)    
          {
              outStream<<BadParameterExeption().what()<<endl;;
          }

          catch(const exception& e){
             outStream<<e.what()<<endl;;
          }
         }
      }
   }
   return 0;
}

궁극적으로 수행하려는 작업에 대해 실제로 설명하지 않았으므로 입력 부분을 처리하는 측면에서 이것을 리팩토링해야 할 것입니다. istream.getline ()은 원시 문자를 처리하며 '이상하게'될 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

확인 된 예외에 대해 try / catch 블록을 우회하는 Lamdas

분류에서Dev

Java의 try / catch 블록에서 예외가 발생한 지점부터 실행을 다시 시작하려면 어떻게해야합니까?

분류에서Dev

ArrayIndexOutOfBounds 예외를 잡기 위해 for 루프 안에 try catch 블록을 추가하려면 어떻게해야합니까?

분류에서Dev

try-catch C #에서 예외를 잡을 수 없습니다.

분류에서Dev

try / catch 블록의 실행이 catch 블록에 도달하더라도 예외 처리에 실패하는 원인은 무엇입니까?

분류에서Dev

Visual Studio 2015에서 Try Catch 블록에서 예외 발생

분류에서Dev

예외 처리에서 C #에서 Nested try-catch를 적용하는 최대 횟수

분류에서Dev

popen을 사용하여 두 개의 실행 파일을 사용하여 C에서 읽고 쓰기

분류에서Dev

try / catch 블록에서 예외가 포착되지 않음

분류에서Dev

smtp 예외가 로컬 서버에 오류 메시지를 표시해야하는 동안 사용 된 try-catch 블록

분류에서Dev

처리되지 않은 예외에 대해 try catch를 사용하는 이상한 동작

분류에서Dev

getline ()을 사용하여 파일에서 행 읽기 문제

분류에서Dev

Try / Catch 블록 전에 InputStream을 초기화하는 방법

분류에서Dev

public static void mvc 속성에서 try catch 예외 처리 후 하위 코드 행을 계속 거부하려면 어떻게해야합니까?

분류에서Dev

try 블록이 예외를 throw하지 않아도 실행되는 catch 블록?

분류에서Dev

try 블록이 예외를 throw하지 않아도 실행되는 catch 블록?

분류에서Dev

생성기 이해와 목록 이해를 사용하여 파일에서 행 읽기

분류에서Dev

파일 내용 읽기에 대한 파일을 찾을 수 없음 예외

분류에서Dev

Catch 블록에서 Try-Catch 블록을 다시 사용합니다.

분류에서Dev

TestNG 어설 션 오류 및 런타임 예외 모두에 대해 단일 catch 블록을 사용하는 방법

분류에서Dev

C ++에서 "try catch (...)"로 잡을 수있는 예외는 무엇입니까?

분류에서Dev

정적 초기화 블록에서 try catch 사용

분류에서Dev

캐치 후 블록을 계속 시도하십시오. 한 번의 시도 catch에서 모든 예외 기록

분류에서Dev

Exception catch 블록 내에서 예외 유형을 확인하고 기록합니다.

분류에서Dev

Fortran에서 패딩을 사용하여 파일에서 행 읽기

분류에서Dev

인증을 사용하여 공유 폴더에서 파일 데이터 읽기 (FileNotFound 예외)

분류에서Dev

BaseAdapter를 사용하여 ListView에 대한 검색 기능을 수행하는 동안 NullPointer 예외

분류에서Dev

예외가 발생하면 try 블록을 일시 중지하고 catch 블록을 실행 한 다음 다시 try 블록을 다시 시작할 수 있습니다.

분류에서Dev

소멸자에서 발생한 예외에 대한 catch 블록

Related 관련 기사

  1. 1

    확인 된 예외에 대해 try / catch 블록을 우회하는 Lamdas

  2. 2

    Java의 try / catch 블록에서 예외가 발생한 지점부터 실행을 다시 시작하려면 어떻게해야합니까?

  3. 3

    ArrayIndexOutOfBounds 예외를 잡기 위해 for 루프 안에 try catch 블록을 추가하려면 어떻게해야합니까?

  4. 4

    try-catch C #에서 예외를 잡을 수 없습니다.

  5. 5

    try / catch 블록의 실행이 catch 블록에 도달하더라도 예외 처리에 실패하는 원인은 무엇입니까?

  6. 6

    Visual Studio 2015에서 Try Catch 블록에서 예외 발생

  7. 7

    예외 처리에서 C #에서 Nested try-catch를 적용하는 최대 횟수

  8. 8

    popen을 사용하여 두 개의 실행 파일을 사용하여 C에서 읽고 쓰기

  9. 9

    try / catch 블록에서 예외가 포착되지 않음

  10. 10

    smtp 예외가 로컬 서버에 오류 메시지를 표시해야하는 동안 사용 된 try-catch 블록

  11. 11

    처리되지 않은 예외에 대해 try catch를 사용하는 이상한 동작

  12. 12

    getline ()을 사용하여 파일에서 행 읽기 문제

  13. 13

    Try / Catch 블록 전에 InputStream을 초기화하는 방법

  14. 14

    public static void mvc 속성에서 try catch 예외 처리 후 하위 코드 행을 계속 거부하려면 어떻게해야합니까?

  15. 15

    try 블록이 예외를 throw하지 않아도 실행되는 catch 블록?

  16. 16

    try 블록이 예외를 throw하지 않아도 실행되는 catch 블록?

  17. 17

    생성기 이해와 목록 이해를 사용하여 파일에서 행 읽기

  18. 18

    파일 내용 읽기에 대한 파일을 찾을 수 없음 예외

  19. 19

    Catch 블록에서 Try-Catch 블록을 다시 사용합니다.

  20. 20

    TestNG 어설 션 오류 및 런타임 예외 모두에 대해 단일 catch 블록을 사용하는 방법

  21. 21

    C ++에서 "try catch (...)"로 잡을 수있는 예외는 무엇입니까?

  22. 22

    정적 초기화 블록에서 try catch 사용

  23. 23

    캐치 후 블록을 계속 시도하십시오. 한 번의 시도 catch에서 모든 예외 기록

  24. 24

    Exception catch 블록 내에서 예외 유형을 확인하고 기록합니다.

  25. 25

    Fortran에서 패딩을 사용하여 파일에서 행 읽기

  26. 26

    인증을 사용하여 공유 폴더에서 파일 데이터 읽기 (FileNotFound 예외)

  27. 27

    BaseAdapter를 사용하여 ListView에 대한 검색 기능을 수행하는 동안 NullPointer 예외

  28. 28

    예외가 발생하면 try 블록을 일시 중지하고 catch 블록을 실행 한 다음 다시 try 블록을 다시 시작할 수 있습니다.

  29. 29

    소멸자에서 발생한 예외에 대한 catch 블록

뜨겁다태그

보관