istream, getline, 이진 파일, regex 및 문자열에서 C ++ 예기치 않은 동작

JACH

텍스트와 이진 형식 (때로는 일반 텍스트)을 결합한 파일로 작업하고 있습니다. 그래서 파일을 바이너리로 열고 시도해보기로 결정했습니다. 그러나 나중에 정규식 (메모리 손상을 나타내는 종류의 문제)을 사용할 때 예기치 않은 동작이 발생합니다.

(최소한의 예를 갖도록 편집)

#include <string>
#include <iostream>
#include <fstream>
#include <regex>
#include <ios>

struct FortranFormat {
    std::string itemsPerRow;
    std::string type;
    std::string numberOfCharacters;
};

class XXXParserException: virtual public std::runtime_error {
    using runtime_error::runtime_error;
};


std::string parseSection(const std::string &line) {
    return  line.substr(16, std::string::npos );
}


FortranFormat parse(const std::string& expression) {
    const std::regex getItemsExpr("\\(([0-9]+)([A|a|I|i|F|f|E|e])([0-9]+)\\)");

    std::cout << "expression: " << expression << std::endl;

    std::smatch elements;
    if (std::regex_match(expression, elements, getItemsExpr)) {
        
        return {elements[1].str(),elements[2].str(),elements[3].str()};
    } else {
        throw XXXParserException("The expression " + expression + " is not a recognized Fortran Format.");
    }
}

void main() {

    std::ifstream fb;
    fb.open("example.txt", std::ios::binary); // remove the binary flag, and it works
    std::string line;
    getline(fb, line);
    std::cout << "line: " << line << std::endl;
    std::string formula = parseSection(line);
  
    auto format = parse(formula);
    
    std::cout << "format: " << format.type << std::endl;
}

인쇄물에는 올바른 정보가 있습니다.

line: *VALUES        6(5E16.8)
expression: (5E16.8)

(예외 텍스트도 깨지고 마지막 부분 만 있습니다 : "은 인식 된 Fortran 형식이 아닙니다.")

그래서, 아무것도 아닌 것보다 호기심에서 더 나옵니다. 제가 내부적으로 무언가를 깨뜨리는 근본적으로 잘못된 일을하고 있습니까? 이것이 컴파일러 (VS2015) 때문일 수 있습니까?

참고로, 문제를 해결하기 위해 "형식 간 이동 접근 방식"을 시도해 보겠습니다 (현재 위치 저장, 필요에 따라 텍스트 또는 바이너리로 닫고 열기, 위치 복원).하지만 현재 내 문제가 무엇인지 이해하고 싶습니다. 접근하다.

일각수

고려해야 할 두 가지 사항이 있습니다.

텍스트 모드에서는 \n기본 EOL 조합으로 처리됩니다 (따라서 \r\nWindows에서). 바이너리 모드에서는 그러한 작업이 수행되지 않으므로 \n항상 개행 문자 만 사용됩니다. 까지 가능한 한 많은 텍스트를 읽도록 요청합니다 \n. Windows \r에서는 문자열 끝에 남습니다 .

그런 다음 std::regex_match정규식과 일치하는 전체 문자열이 필요합니다. 정규식은 문자열 끝에 추가 공백을 허용하지 않으므로 일치하지 않습니다. 마지막 문자가없는 하위 문자열이 패턴과 일치하기 때문에 해당 입력을 std::regex_search반환 true합니다.


Protip : 원시 문자열 리터럴리터럴 을 이스케이프 할 필요가 없기 때문에 정규식을 훨씬 쉽게 만듭니다 (지금 regex101에서 디버그하기 쉽습니다!).

const std::regex getItemsExpr(R"eos(\(([0-9]+)([A|a|I|i|F|f|E|e])([0-9]+)\))eos");

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C에서 문자열 및 루프의 예기치 않은 동작을 이해할 수 없습니다.

분류에서Dev

getline (cin)이 예기치 않게 작동 함 (C ++)

분류에서Dev

`? {1,2}`에 대한 단어 찾기 및 바꾸기에서 예기치 않은 동작이 발생합니다. 긴 문자열 일치

분류에서Dev

문자열 및 std.file에서 예기치 않은 동작

분류에서Dev

while (getline ())이 작동하지 않는 파일에서 행 읽기

분류에서Dev

Regex에서 예기치 않은 동작을 일으키는 줄 바꿈 문자

분류에서Dev

파이썬 압축 풀기 문제 (예기치 않은 동작)

분류에서Dev

C ++ 문자열 스트림 문제 : getline이 stringstream에서 작동하지 않습니다.

분류에서Dev

CTE 및 DML 문에서 PG 예기치 않은 동작

분류에서Dev

Qt C ++에서 컴파일 된 C 라이브러리 함수를 호출하면 예기치 않은 동작이 발생 함

분류에서Dev

.test ()에서 JavaScript Regex 예기치 않은 동작

분류에서Dev

배치 파일에서 문자열 분할이 작동하지 않습니다.

분류에서Dev

ksh에서 -i 옵션 (파일에서 SQL 읽기)을 사용하여 sqlcmd를 실행 한 후 파일 설명자 및 / 또는 I / O 스트림의 예기치 않은 동작이 무한 루프를 생성 함

분류에서Dev

C 문자 입력이 스위치 및 for 루프에서 예상대로 작동하지 않습니다.

분류에서Dev

C ++에서 삼항 연산자의 예기치 않은 동작

분류에서Dev

C #에서 삼항 연산자의 예기치 않은 동작

분류에서Dev

C #에서 예기치 않은 제네릭 형식 인터페이스 동작

분류에서Dev

C 파일에서 모바일 데이터 (문자열 및 숫자) 읽기

분류에서Dev

C ++에서 getline ()은 여러 문자열을 차례로 받아들이는 동안 문자열의 모든 문자를 읽지 않습니다.

분류에서Dev

파이프 내부의 n_distinct에서 예기치 않은 동작

분류에서Dev

C에서 여러 부분으로 문자 배열 분할 : 예기치 않은 동작

분류에서Dev

Ruby gsub regex 예기치 않은 동작

분류에서Dev

동일한 이름의 Route 매개 변수 및 뷰 모델 속성-예기치 않은 동작

분류에서Dev

광택에 대한 일괄 작업이 작동하지 않습니다 : awk : cmd. line : 1 "예기치 않은 줄 바꿈 또는 문자열 끝"

분류에서Dev

파일을 바이트 크기로 분할 할 때 예기치 않은 동작

분류에서Dev

using 및 여러 else if 문-예기치 않은 파일 끝 출력

분류에서Dev

문자열을 입력하기 위해 함수에서 여러 getline을 사용하면 왜 예기치 않게 작동합니까?

분류에서Dev

bash 함수 내에서`find -exec`를 실행하는 방법 --- 문자 이스케이프 문제 및 예기치 않은 파일 끝

분류에서Dev

파일에서 문자열 및 RegEx 바꾸기

Related 관련 기사

  1. 1

    C에서 문자열 및 루프의 예기치 않은 동작을 이해할 수 없습니다.

  2. 2

    getline (cin)이 예기치 않게 작동 함 (C ++)

  3. 3

    `? {1,2}`에 대한 단어 찾기 및 바꾸기에서 예기치 않은 동작이 발생합니다. 긴 문자열 일치

  4. 4

    문자열 및 std.file에서 예기치 않은 동작

  5. 5

    while (getline ())이 작동하지 않는 파일에서 행 읽기

  6. 6

    Regex에서 예기치 않은 동작을 일으키는 줄 바꿈 문자

  7. 7

    파이썬 압축 풀기 문제 (예기치 않은 동작)

  8. 8

    C ++ 문자열 스트림 문제 : getline이 stringstream에서 작동하지 않습니다.

  9. 9

    CTE 및 DML 문에서 PG 예기치 않은 동작

  10. 10

    Qt C ++에서 컴파일 된 C 라이브러리 함수를 호출하면 예기치 않은 동작이 발생 함

  11. 11

    .test ()에서 JavaScript Regex 예기치 않은 동작

  12. 12

    배치 파일에서 문자열 분할이 작동하지 않습니다.

  13. 13

    ksh에서 -i 옵션 (파일에서 SQL 읽기)을 사용하여 sqlcmd를 실행 한 후 파일 설명자 및 / 또는 I / O 스트림의 예기치 않은 동작이 무한 루프를 생성 함

  14. 14

    C 문자 입력이 스위치 및 for 루프에서 예상대로 작동하지 않습니다.

  15. 15

    C ++에서 삼항 연산자의 예기치 않은 동작

  16. 16

    C #에서 삼항 연산자의 예기치 않은 동작

  17. 17

    C #에서 예기치 않은 제네릭 형식 인터페이스 동작

  18. 18

    C 파일에서 모바일 데이터 (문자열 및 숫자) 읽기

  19. 19

    C ++에서 getline ()은 여러 문자열을 차례로 받아들이는 동안 문자열의 모든 문자를 읽지 않습니다.

  20. 20

    파이프 내부의 n_distinct에서 예기치 않은 동작

  21. 21

    C에서 여러 부분으로 문자 배열 분할 : 예기치 않은 동작

  22. 22

    Ruby gsub regex 예기치 않은 동작

  23. 23

    동일한 이름의 Route 매개 변수 및 뷰 모델 속성-예기치 않은 동작

  24. 24

    광택에 대한 일괄 작업이 작동하지 않습니다 : awk : cmd. line : 1 "예기치 않은 줄 바꿈 또는 문자열 끝"

  25. 25

    파일을 바이트 크기로 분할 할 때 예기치 않은 동작

  26. 26

    using 및 여러 else if 문-예기치 않은 파일 끝 출력

  27. 27

    문자열을 입력하기 위해 함수에서 여러 getline을 사용하면 왜 예기치 않게 작동합니까?

  28. 28

    bash 함수 내에서`find -exec`를 실행하는 방법 --- 문자 이스케이프 문제 및 예기치 않은 파일 끝

  29. 29

    파일에서 문자열 및 RegEx 바꾸기

뜨겁다태그

보관