최근에 필자는 간단한 텍스트 - 투 - char 문자열 판독기를 만들었지 만 파일의 끝 부분에 이상한 텍스트를 반환하는 것 같습니다.파일 읽기 손상된 파일 끝 반환
그래서 여기에 내가 읽을려고 파일 중 하나입니다 :
#version 330 core
in vec3 inputColour;
out vec4 outputColour;
void main()
{
outputColour = vec4(inputColour, 1.0f);
}
그것은 GLSL로 작성된 OpenGL을 쉐이더 참고로,입니다. 나는 그것을 "읽기"할 때 그러나,이를 반환
참고 명령 창 끝의 네 2
문자. 런타임에이 쉐이더를 컴파일하려고하면 원래 텍스트에없는 일부 문자와 함께 오류가 반환됩니다. 나는 breakpoint를 만들고 그것을 더 깊이 들여다 보았다. 나는 기능을 실행하고 텍스트 영상 효과를 개방하고이를 반환
가 다시, 텍스트, ýýýý
의 끝에서 또 다른 4 개 문자가 있습니다.
다음은 텍스트 리더의 코드입니다 :
std::ifstream inputFile("foo.txt", std::ios::in|std::ios::binary|std::ios::ate);
int inputFileSize;
char* buffer = "";
if (inputFile.is_open())
{
inputFile.seekg(0, std::ios::end); //Set the cursor to the end.
inputFileSize = (int)inputFile.tellg(); //Set inputFileSize to the position of the cursor.
buffer = new char[inputFileSize]; //Create the buffer and set its size to the inputFileSize.
inputFile.seekg(0, std::ios::beg); //Move the cursor to the beginning.
inputFile.read(buffer, inputFileSize); //Read the file from the beginning.
inputFile.close(); //Close the file
}
내 생각이 라인 엔딩 잘못 읽을 함께 할 수있는 뭔가가있을 수 있다는 것입니다. 그러나 Notepad ++ 및 내부 Visual Studio 편집기로 작성된 파일을 테스트했으며 두 결과 모두 동일한 결과를 얻었습니다.
"해결 방법"을 찾을 수있었습니다. 즉, 매우 위험한 해법인데, 이것은 아주 나쁜 습관입니다. 기본적으로 [FILEEND]
과 읽은 텍스트 파일의 끝을 넣을 수 있습니다. 코드에서 [FILEEND]
또는 전혀 사용할 수 없지만 파일을 올바르게 읽으려면 코드에 [FILEEND]
이 필요합니다.
char* fileend = std::strstr(buffer, "[FILEEND]"); //Find [FILEEND].
int actualfilelen = fileend != NULL ? std::strlen(buffer) - std::strlen(fileend) : std::strlen(buffer); //Get the length of the main content of txt file.
//If there is no [FILEEND] then return the size of the buffer without any adjustments.
char* output = new char[actualfilelen + 1]; //Create new string with the length of the main content of txt file.
std::strncpy(output, buffer, actualfilelen); //Copy main content of buffer to output.
output[actualfilelen] = '\0'; //Add escape sequence to end of file.
delete(buffer); //Deletes the original buffer to free up memory;
그런 다음 output
변수를 반환합니다. 파일의 마지막에 [FILEEND]
키워드 (?)를 사용하고 싶지 않으므로 즉시 이동성이 떨어지기 때문에. 하나 또는 두 개의 파일 [FILEEND]
함께 괜찮을 수도 있지만 다른 프로젝트에서 사용하려는 파일이 수백 있다면 그들은 모두 [FILEEND]
있습니다.
필자는 다음과 같이 코드를 편집했습니다. http://pastebin.com/rhdEHP7X 런타임 컴파일러가 이제는이 코드를 완벽하게 읽지 만 텍스트 끝에 '.'기호가 있습니다. 텍스트 인코딩을 유니 코드에서 ANSI로 변경하려고 시도했지만 아무 것도하지 않았습니다. 필자는 printf 함수를 대신 사용하려고했지만 똑같은 결과를 보여주었습니다. 나는 버퍼가 길이로 설정되어 있고 더 출력하기 때문에 이것이 어떻게 일어나는지 이해하지 못한다. 예를 들어, 내 파일 중 하나는 130 자입니다. 관리자는'inputFileSize'가 130인지 확인했습니다. 이제 버퍼는 131이어야하지만 그렇지 않습니다. –
쉐이더에서'[FILEEND]'키워드를 삭제하고'[FILEEND]'단축 코드를 제거했습니다. 나는 그것이 다른 배열에 "복사"되고 삭제되지 않는 한, 함수의 출력이므로 버퍼를 삭제할 수 없습니다. –
최소한의 완전한 프로그램을 입력 파일로 게시하십시오. 최소한의 강조. 내가 편집 및 재현하지 않고 gcc 수 있어야합니다. –