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

니키타

파일을 가져 와서 클래스의 stringstream 필드로 읽는 프로그램을 작성했으며 이제는 파일과 상호 작용하려고합니다. 문제는 여러 방법에서 순차적으로 읽을 때 방법 중 하나에서 오류가 발생하거나 단순히 작동하지 않는다는 것입니다. 문제는 파일을 읽는 방법입니다. 어떻게 개선해야합니까?

내 수업이 있습니다.

class MatReader
{
protected:
    ...
    stringstream text;
    ...
    string PhysicsMaterial;
    string Diffuse;
    string NMap;
    string Specular;

public:
    /// <summary>
    /// Read all lines in .mat document by string
    /// </summary>
    void ReadAllLines(string file_path);
    /// <summary>
    /// Getting PhysicsMaterial property
    /// </summary>
    string getPhysMaterial();
    /// <summary>
    /// Getting diffuse file path
    /// </summary>
    string getDiffuseLocation();
};

그리고 내 구현 파일이 있습니다.

#include "MaterialHandler.h"

void MatReader::ReadAllLines(string mat_file)
{
    ifstream infile(mat_file);
    string str;
    if (infile.is_open())
    {
        ofile = true;
        while (!infile.eof())
        {
            getline(infile, str);
            text << str+"\n";
        }
    }
    else
        throw exception("[ERROR] file does not exist or corrupted");
}

string MatReader::getPhysMaterial()
{
    string line;
    vector<string> seglist;
    try
    {
        if (ofile == false)
            throw exception("file not open");
    
        while (getline(text, line, '"'))
        {
            if (!line.find("/>"))
                break;
            seglist.push_back(line);
        }
        for (uint16_t i{}; i < seglist.size(); i++)
        {
            if (seglist[i-1] == " PhysicsMaterial=")
            {
                PhysicsMaterial = seglist[i];
                return seglist[i];
            }
        }
        line.clear();
        seglist.clear();
    }
    catch (const std::exception& ex)
    {
        cout << "[ERROR]: " << ex.what() << endl;
        return "[ERROR]";
    }
}

string MatReader::getDiffuseLocation()
{
    string line;
    vector<string> seglist;
    try
    {
        if (ofile == false)
            throw exception("file not open");
        while (getline(text, line, '"'))
        {
            seglist.push_back(line);
        }
        for (uint16_t i{}; i < seglist.size(); i++)
        {
            if (seglist[i - 1] == " File=")
            {
                PhysicsMaterial = seglist[i];
                return seglist[i];
            }
        }
    }
    catch (const std::exception& ex)
    {
        cout << "[ERROR]: " << ex.what() << endl;
        return "[ERROR]";
    }
}

"getPhysMaterial ()"및 "getDiffuseLocation ()"메서드는 문제없이 개별적으로 작동하지만 순차적으로 실행하면 오류가 발생하거나 전혀 실행되지 않습니다. 감사합니다.

WBuck

따라서 먼저 범위를 벗어난 어레이 액세스 문제를 해결해야합니다. 다음 문제는 처음부터 다시 읽기 위해 스트림의 위치를 ​​재설정해야한다는 것입니다.

다음은이를 수행하는 방법의 예입니다.

std::stringstream ss{ };
ss << "This is line one\n"
   << "This is line two\n"
   << "This is line three\n"
   << "This is line four\n";

// Points to the start of the stringstream.
// You can store this as a member of your class.
const std::stringstream::pos_type start{ ss.tellg( ) };

std::string line{ };
while ( std::getline( ss, line ) )
    std::cout << line << '\n'; 

// Reset to the start of the stringstream.
ss.clear( );
ss.seekg( start );

while ( std::getline( ss, line ) )
    std::cout << line << '\n'; 

내가 발견 한 또 다른 문제 eof는 루프 상태에서 확인하고 있다는 것 입니다. 그렇게하지 마십시오 .. iostream :: eof가 루프 조건 (예 :) 내부에서 while (!stream.eof())잘못된 것으로 간주 되는 이유는 무엇 입니까?

대신 다음과 같이하십시오.

std::stringstream ss{ };
if ( std::ifstream file{ "/Path/To/MyFile.txt" } )
{
    std::string input{ };
    while ( std::getline( file, input ) )
        ss << input << '\n';
}
else 
{
    std::cerr << "Failed to open file\n";
    return 1;
}

std::string line{ };
while ( std::getline( ss, line ) )
    std::cout << line << '\n'; 

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

배열 C에 문자 저장이 제대로 작동하지 않습니다.

분류에서Dev

벡터 문자열 push_back이 C ++에서 작동하지 않습니다.

분류에서Dev

C ++ 문자열에서 공백 제거가 작동하지 않습니다.

분류에서Dev

부울 식에 대한 문자열이 작동하지 않습니다. C ++

분류에서Dev

C의 HashTable이 문자열에 대해 작동하지 않습니다.

분류에서Dev

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

분류에서Dev

PHP 정렬이 텍스트 문자열 배열에서 작동하지 않습니다.

분류에서Dev

스트림에서로드 된 libvlcsharp 비디오 구문 분석이 작동하지 않습니다.

분류에서Dev

c unix execl이 strcat으로 작성된 문자열에서 작동하지 않습니다.

분류에서Dev

C에서 문자 배열에 값을 할당하는 것이 작동하지 않습니다.

분류에서Dev

Laravel 컨트롤러에서 If 문이 제대로 작동하지 않습니다.

분류에서Dev

itextsharp 설정 트림 상자가 내 문서의 첫 페이지에서 작동하지 않습니다.

분류에서Dev

자바 스크립트 문자열 검색이 작동하지 않습니다.

분류에서Dev

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

분류에서Dev

이중 슬래시가 문자열 C #에서 올바르게 작동하지 않습니다.

분류에서Dev

C ++ While 문이 문자열 및 "or"와 함께 작동하지 않습니다.

분류에서Dev

내 PHP 기능이 작동하지 않습니다-정수에서 문자열로의 변환 문제

분류에서Dev

Delphi RIO-Ansi 문자열이 const 배열의 일부인 경우 Ansi에서 문자열 캐스트가 작동하지 않습니다.

분류에서Dev

문자열에서 숫자 추출이 작동하지 않습니다! 씨

분류에서Dev

파일에 대한 C ++ 출력 스트림이 작동하지 않습니다.

분류에서Dev

문자열이 제대로 작동하지 않습니다

분류에서Dev

문자열이 제대로 작동하지 않습니다

분류에서Dev

각도 부트 스트랩 문제 angular.bootstrap이 내 앱에서 작동하지 않습니다.

분류에서Dev

클릭 이벤트가 innerhtml 문자열 각도 6에서 작동하지 않습니다.

분류에서Dev

클릭 이벤트가 innerhtml 문자열 각도 6에서 작동하지 않습니다.

분류에서Dev

pyodbc 데이터 세트 내에서 문자열 찾기가 작동하지 않습니다.

분류에서Dev

하위 문자열이 jquery .text ()에서 작동하지 않습니다.

분류에서Dev

C # 다중 코드 문자열 보간이 작동하지 않습니다.

분류에서Dev

Import 문이 타이프 스크립트에서 작동하지 않습니다.

Related 관련 기사

  1. 1

    배열 C에 문자 저장이 제대로 작동하지 않습니다.

  2. 2

    벡터 문자열 push_back이 C ++에서 작동하지 않습니다.

  3. 3

    C ++ 문자열에서 공백 제거가 작동하지 않습니다.

  4. 4

    부울 식에 대한 문자열이 작동하지 않습니다. C ++

  5. 5

    C의 HashTable이 문자열에 대해 작동하지 않습니다.

  6. 6

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

  7. 7

    PHP 정렬이 텍스트 문자열 배열에서 작동하지 않습니다.

  8. 8

    스트림에서로드 된 libvlcsharp 비디오 구문 분석이 작동하지 않습니다.

  9. 9

    c unix execl이 strcat으로 작성된 문자열에서 작동하지 않습니다.

  10. 10

    C에서 문자 배열에 값을 할당하는 것이 작동하지 않습니다.

  11. 11

    Laravel 컨트롤러에서 If 문이 제대로 작동하지 않습니다.

  12. 12

    itextsharp 설정 트림 상자가 내 문서의 첫 페이지에서 작동하지 않습니다.

  13. 13

    자바 스크립트 문자열 검색이 작동하지 않습니다.

  14. 14

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

  15. 15

    이중 슬래시가 문자열 C #에서 올바르게 작동하지 않습니다.

  16. 16

    C ++ While 문이 문자열 및 "or"와 함께 작동하지 않습니다.

  17. 17

    내 PHP 기능이 작동하지 않습니다-정수에서 문자열로의 변환 문제

  18. 18

    Delphi RIO-Ansi 문자열이 const 배열의 일부인 경우 Ansi에서 문자열 캐스트가 작동하지 않습니다.

  19. 19

    문자열에서 숫자 추출이 작동하지 않습니다! 씨

  20. 20

    파일에 대한 C ++ 출력 스트림이 작동하지 않습니다.

  21. 21

    문자열이 제대로 작동하지 않습니다

  22. 22

    문자열이 제대로 작동하지 않습니다

  23. 23

    각도 부트 스트랩 문제 angular.bootstrap이 내 앱에서 작동하지 않습니다.

  24. 24

    클릭 이벤트가 innerhtml 문자열 각도 6에서 작동하지 않습니다.

  25. 25

    클릭 이벤트가 innerhtml 문자열 각도 6에서 작동하지 않습니다.

  26. 26

    pyodbc 데이터 세트 내에서 문자열 찾기가 작동하지 않습니다.

  27. 27

    하위 문자열이 jquery .text ()에서 작동하지 않습니다.

  28. 28

    C # 다중 코드 문자열 보간이 작동하지 않습니다.

  29. 29

    Import 문이 타이프 스크립트에서 작동하지 않습니다.

뜨겁다태그

보관