2010-04-27 3 views
6

반환 구분 파일을 읽으려고합니다. 문구가 가득합니다. n 구분 된 파일에서 문자열을 읽는 방법

각 문구를 하나의 문자열에 넣으려고합니다.

문제는 내가

fscanf(file,"%50s\n",string); 

으로 파일을 읽을 때 문자열이 하나 개의 단어가 포함되어 있다는 점이다. 공백이 있으면 공백을 감지하여 문자열 읽기를 중지합니다.

답변

2

fscanf는 이전 공백을 읽을 수 있도록 수정할 수 있습니다. 세부 사항은 약간 복잡합니다. 여기에 사람이 페이지

이 받아 지정된 문자 세트에서 문자의 비어 있지 않은 순서를 일치 [...] %에 대해 말씀입니다; 다음 포인터 은 char에 대한 포인터 여야하며 문자는 문자열의 모든 문자와 NUL 문자를 종료하는 문자의 충분한 공간이되어야합니다. 일반적으로 공백이 건너 뛰면 이 표시되지 않습니다. 문자열은 문자 집합으로 이루어져야합니다 (또는 포함되지 않음) 특정 집합입니다. 세트는 으로 열리고 브래킷 [문자와 닫기 브래킷] 문자 사이의 문자로 정의됩니다. 열린 대괄호 뒤의 첫 번째 문자가 곡절 기호^일 경우 집합에서 문자를 제외합니다. 세트에 괄호 ( )를 포함 시키려면 열기 브래킷 다음에 문자 또는 곡절 기호 을 만드십시오. 다른 위치 인 은 세트를 종료합니다. 하이픈 문자 - 또한 특수 문자입니다. 두 개의 다른 문자 사이에 이 있으면 은 모든 중간 문자를 에 추가합니다. 하이픈을 포함 시키려면 마지막 문자 인 마지막 문자 을 대괄호로 사용하십시오. 예를 들어, `[^] 0-9-] '는 괄호를 제외한 모든 항목이 이고 0이 9 개이고 하이픈이' '인 것을 의미합니다.문자열은 으로 끝나며 (또는 곡절 기호, 함께) 집합이 이 아니거나 필드 너비가 부족한 문자로 끝납니다.

따라서 % [^ \ n]은 캐리지 리턴까지 모든 것을 읽어야합니다.

+2

그것은 줄 바꿈까지 모든 것을 읽지 만 * 줄 바꿈 자체는 아닙니다. 'fscanf (file, "% [^ \ n]")'을 반복하면 빈 문자열을 계속해서 계속 얻을 수 있습니다. 형식 문자열의 공백이나'% * c'와 같은 것을 사용하여 개행 문자를 사용해야합니다. –

+0

감사합니다. –

+0

@Adam 좋은 지적. 위의 대답은 버퍼 오버 플로우 오류에 대해서도 안전합니다. –

3

fscanf%s 공백을 발견하면 읽기가 중지됩니다. 당신이 포맷되지 않은 텍스트를 읽기 때문에

, 당신은 단순히 당신이 그것을 줄 버퍼를 채울 때까지이 줄 바꿈 (\n)를 발견하거나 둘 중 먼저 파일의 마지막에 도달, 읽는, fgets를 사용할 수 있습니다.

+0

이상하게 작동합니다. 모든 행을 읽지는 않습니다. \ 0으로 끝나는 대신에 각 문자열은 \ n으로 끝납니다. –

+1

각 문자열은 여전히''\ 0 ''로 끝나지 만 그 앞에있는 마지막 문자는 대개' '\ n' '입니다. 파일에 나타납니다. ''\ n ''이 없다면, 버퍼가 전체 라인에 대해 충분히 크지 않았거나, 파일의 마지막 문자를 읽었을 때 줄 바꿈으로 끝나지 않았 음을 의미합니다. – caf

5
fscanf(file,"%50[^\n]\n",string); 
  1. \n를 제외한 모든 문자가 [^\n]

  2. 최대 0F 50 개 문자에 의해 소비 될 것이다 소모됩니다

  3. ..\n (확인 문자열을 만들 수는 51이어야를위한 공간이) ",string 이렇게하면 \n도 소비되므로 xt 호출은 null 문자열을 리턴하지 않습니다.

+0

이것은 위대한 작품, 고마워요 –

2

Avoid using scanf. 이미 언급했듯이 fgets을 사용해야합니다.

고정 크기 버퍼를 사용하지 않고 임의 길이의 줄을 허용하려면 Chuck Falconer's public domain ggets function을 사용해보십시오. (링크 지금 다운 보이지만 archive.org has a copy.)

+0

@ Zenikoder : 와우, 당신은 곤경에 빠져서'ggets'에 대한 언급을 포기한 적이 있습니까? 어쨌든, 당신이 CBFalconer의 정신을 어떻게 생각 하든지 관계없이, 저자가 아닌 코드를 판단해야합니다. 'ggets' 구현에 대해 특정 불만이 있다면 충분히 공정하지만 나는 그 사람을 좋아하지 않기 때문에 downvote하는 것이 공평하다고 생각하지 않습니다. – jamesdlin

-1

는 intially Payload_ID 00 01 02 03 10 ....

사용

* CHAR를 PChar = ""을 이용하여 데이터를 송신; // 문자열 캡처 용.

fprintf (fp1, "% s", strtok (pChar, "Payload_ID")));

+0

여기 Payload_ID는 지정할 수있는 구분 기호입니다. –