2012-10-28 6 views
3

제목 자체가 말하는 것 같습니다.C에서 다른 줄 끝을 올바르게 인식하는 방법?

저는 Windows 7에서 g ++ 및 메모장 ++를 사용하여 파일 내용을 비교하는 C 프로그램을 코딩하고 있습니다. 파일의

내용 :

simple 
file with lines 

파일은 윈도우 스타일 CRLF 라인 엔딩을 가지고있다. 이 코드를 사용하여 파일의 길이를 계산하면

는 :

fseek(file, 0, SEEK_END); 
size = ftell(file); 
fseek(file, 0, SEEK_SET); 

을 나는 23를 얻을.

줄 끝을 Unix 형식 LF (Notepad ++ 사용)로 변경하면 길이가됩니다.

이렇게하면 두 파일을 비교할 때 문제가 발생합니다. 그래서 주어진 파일에 LF 또는 CR 또는 CRLF가 있는지 확인하는 방법이 있는지 묻습니다.

CR과 LF를 구별 할 수 있다는 것을 알고 있습니다. LF에는 ASCII 코드 10이, CR에는 ASCII 코드 13이 있습니다. 또는 LF는 '\ n'이고 CR은 '\ r'입니다.

하지만 char 뒤에 file char을 읽을 때 CRLF가 있더라도 항상 LF (ascii 10)를 얻습니다.

나는 분명히했으면 좋겠다. 감사.

+1

그러면 파일을 읽고 'ftell'을 사용하지 않고 문자를 계산합니다. 'ftell'은 파일의 바이트 수를 반환합니다. 이것은 단순히 당신이 원하지 않는 것입니다. * 문자 수를 원합니다. – Bakuriu

답변

2

텍스트 읽기와 이진 모드의 차이점은 다음과 같습니다.

텍스트 모드 (관련 매개 변수 fopen(file, "r"), getc 등)의 모든 줄 끝은 한 문자로 읽습니다. 예를 들어 바이너리 모드로 읽는 경우 fopen(file, "rb") 그러면 실제 바이트가 표시되고 CRLF와 CR이 다르게 표시됩니다. fseek는 실제 바이트 수를 사용하므로 줄 끝의 차이를 봅니다.

그리고 다른 두 가지 방법으로 파일을 읽고 크기가 다른지 확인하거나 실제 크기가 다른지 확인하십시오. 실제로 현재 LF가 있는지 확인하지 않아도됩니다. 주요 OS는이를 라인 인 핑 (enfing)으로 사용합니다.

#include <fcntl.h> 
#include <io.h> 

... 

_setmode(fileno(stdin), _O_BINARY); 

이 더 입력을 제공하거나 작품 : 당신은 이미 (예 : stdin 또는 stdout를) 열려있는 파일 핸들이 작업을 수행해야하는 경우 마크의 대답에 추가

+0

감사합니다, 저를 위해 일했습니다! – Horkyze

1

, 당신은 _setmode()을 사용할 수 있습니다 출력은 이미 해당 파일 핸들에 발생했습니다. 덧붙여 말하자면, _setmode()은 Windows와 DOS에만 존재합니다. 유닉스 계열 운영체제 (OS X 이후 Mac OS 버전 포함)에서는 파일이 효과적으로 항상 바이너리 모드로 열리고 fopen(file, "...b")은 받아 들여지지 만 효과는 없습니다. 이러한 플랫폼에서 줄 끝은 단일 문자 \n으로 인코딩됩니다.

+1

_on Unix [...] 파일은 항상 바이너리 모드로 열립니다 _ - 또는 유닉스에서 텍스트와 바이너리 모드를 구별하지 않습니다. 'fopen()'과''...b "는 C90 이후의 C에서 이식 가능하며 유닉스에서는 허용되지만 아무런 차이가 없습니다. (물론) –

+0

@JohnMarshall : 좋은 지적. 명확하게 편집했습니다. –

+0

매우 유용한 정보를 주셔서 감사합니다. – Horkyze