2010-07-23 3 views
2

freadfscanf과 동일한 기능을 에뮬레이트하는 빠른 메모리 리더 클래스를 작성했습니다.sscanf_s가 마지막 작업에서 읽은 바이트 수를 얻는 방법은 무엇입니까?

기본적으로 memcpy을 사용하고 fread과 같은 데이터를 읽는 내부 포인터를 늘렸지 만 fscanf_s 전화가 왔습니다. sscanf_s을 사용했습니다. 단, 데이터에서 몇 바이트를 읽었는지는 알 수 없습니다.

sscanf_s 문자열 판독기의 내부 포인터를 늘리려면 마지막 작업에서 읽은 바이트 수를 알 수있는 방법이 있습니까? 감사!

편집 : 나는 읽고있다

그리고 예 형식은 다음과 같습니다 |172|44|40|128|32|28|

fscanf, 그래서 sscanf를 미세한다는 것을 읽습니다. 유일한 이유는 인 경우로,이다 :

|0|0|0|0|0|0|

길이는 다를 것입니다. 내가 궁금해하는 부분은 fscanf가 파일 포인터를 어디에 둘 것인지 알고 있지만 sscanf는 그렇지 않다.

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l 

각 기능

+0

(편집 후) '% n'이 (가) 필요합니다. – Abel

+0

[sscanf가 읽는 문자 수를 얻으시겠습니까?] (http://stackoverflow.com/questions/13503135/get-number-of-characters) -read-by-sscanf) – sevko

답변

2

어쩌면 나는 바보 같지만 어쨌든 시도 할 것입니다. 그것은 코멘트 스레드에서 여전히 오해가있는 것 같습니다. 바이트 수를 알아야합니다. 그러나이 메서드는 읽은 필드의 양 또는 EOF 만 반환합니다.

바이트 수를 얻으려면 쉽게 계산할 수있는 것을 사용하거나 형식 문자열에 크기 지정자를 사용하십시오. 그렇지 않으면, 얼마나 많은 바이트가 읽혔는지 알아낼 기회를 얻지 못할 것이고, 그 다음에는 필드를 하나씩 읽는 것입니다. 또한, 당신이 의미하는 것은

sscanf_s(source, "%d%d"...) 

다른 길이가 모두 입력 "123 456"과 "10 \ T30"에 성공할 것입니다. 이 경우 크기를 다시 변환하지 않으면 크기를 알 수 없습니다. 그래서 : 고정 된 크기의 필드를 사용하거나 망각 속에 남겨 두십시오 .... %c을 사용할 때 출력에 필드 구분 기호 (줄 바꿈, 탭 및 공백)를 포함하는 유일한 방법이라는 것을 기억하십시오. 다른 모든 사람들은 필드 경계를 건너 뛰므로 적절한 바이트 수를 찾기가 더 어려워집니다.

편집 : "C++ 완전한 참조"에서
난 그냥 읽기 :

%n  는 에 정수 값을 수신 문자의 수 이하가 지금까지

읽기 그게 네가 한 일이 아니야? 형식 문자열에 추가하기 만하면됩니다. 이것은 confirmed here이지만 sscanf_s로 테스트하지 않았습니다.

+0

편집하고 테스트하여 완벽하게 작동하도록 허용됩니다. 나는 네가 그걸로 대답 한 걸 처음 알았 기 때문에 너를 받아 들였다. 다시 한 번 감사드립니다! – Gbps

+0

@Gbps : 이번에는 환영합니다. ;-). 추신 : 여기에 누군가가 놓친 경우 같은 '% n1'의 MSDN 참조 http://msdn.microsoft.com/en-us/library/6ttkkkhh%28v=VS.80%29.aspx – Abel

0

From MSDN: 성공적으로 변환 할당 된 필드의 수를 반환; 반환 값에는 읽지 만 할당되지 않은 필드는 포함되지 않습니다. 반환 값 0은 할당 된 필드가 없음을 나타냅니다. 반환 값은 오류 또는 첫 번째 변환 전에 문자열 끝에 도달 한 경우 EOF입니다.

+0

그러나 % d, % d, % d을 읽었습니까? 각 숫자가 문자열 형식으로되어있는 기간에 대한 지정자는 없습니다. – Gbps

+0

정확하려면,'char * buffer = new char [80];에서와 같이 char 배열을 사용하고 크기를 지정하십시오 :'sscanf_s (anysource, "% s", buffer, 80);'. 여기에서 : http://www.gamedev.net/community/forums/topic.asp?topic_id=393967 – Abel

+0

그건 필드 수입니다! 질문은 "바이트 수"에 대해 질문했습니다. – Patrick

6

scanf과 패밀리의 경우 형식 문자열에 %n을 사용하십시오. 아무 것도 읽지 않지만,이 호출로 지금까지 읽은 문자 수가 해당 매개 변수에 저장됩니다 (int*이 필요함).

관련 문제