2013-05-21 2 views
4

을 삭제하지 않으므로 이름과 숫자가 많은 입력 파일이 있습니다. 나는 각 문자열에서 모든 데이터를 추출 할 수 있도록 문자열을 나누기 위해 strtok을 사용하기 시작했습니다. 모든 것이 올바르게 작동하는 것처럼 보입니다. 그러나 무엇인가의 이유로 그것은 개행 문자를 버리지 않습니다.strtok는 개행 문자

int procFile(PERSON **data, FILE* fpFile) 
{ 
// Local Declaration 
char temp[1000]; 
char proc[15]; 
char *entry; 
char *loc; 
int success = 0; 

// Statement 
if(fgets(temp, sizeof(temp), fpFile)) 
{ 
    (*data) = aloMem(); // free 
    entry = temp; 
    loc = strtok(entry, "()-"); 
    strcpy(proc, loc); 
    loc = strtok(NULL, "()-"); 
    strcat(proc, loc); 
    loc = strtok(NULL, "()-"); 
    strcat(proc, loc); 
    sscanf(proc, "%ld", &(*data)->phone); 
    loc = strtok(NULL, "\0"); 
    strcpy((*data)->name, loc); 
    success++; 
    printf("%s1", (*data)->name); 
} 

return success; 
}// procFile 

제대로 작동하는지 확인하기 위해 결과를 인쇄 해 보았습니다. 이것이 출력물입니다.

Brown, Joanne 
1South, Frankie 
1Lee, Marie 
1Brown, Joanne 
1Trapp, Ada Eve 
1Trapp, David 
1White, D. Robert 
1Lee, Victoria 
1Marcus, Johnathan 
1Walljasper, Bryan 
1Trapp, Ada Eve 
1Brown, Joanne 
1Andrews, Daniel 

이 아니라 바로 이름 뒤에보다, 줄 바꿈에 각각의 이름 뒤에 1를 인쇄합니다. 누군가가 내게 문제를 해결할 수있는 방법을 설명 할 수 있습니까? man fgets 따르면

+1

에 구분 기호 목록에 t을 : \ http://stackoverflow.com/a/16000784/ 694576 – alk

답변

5

temp을 토큰 화하기 전에, 줄 바꿈을 제거. 그런 다음 개행 문자를 0 (문자열 종료 문자)으로 덮어 씁니다.

+7

또는 구분 기호 목록에'\ n'을 추가하십시오. 입력 라인을 별도로 스캔 할 필요가 없습니다. –

+0

@ John Bode : 성능에 영향을줍니다. 문자열을 \ n 두 번, 토큰을 두 번 스캔합니다. Java와 C# 프로그래머가 그렇게하는 것은 완벽하게 정상이지만 C++ 코더는 더 잘 알고 있습니다. – AlexK

+0

시도했지만 여전히 동일한 출력 =/ – Nathan

3

:

는 fgets()는 (S)가 가리키는 버퍼 크기 스트림으로부터 문자와 그것들을보다 많아야 하나에서 판독한다. EOF 또는 개행 후에 읽기가 중지됩니다. 개행을 읽으면, 버퍼에 저장됩니다.

여기에서 개행 문자를 가져오고 있습니다. 개행 문자

char *newline = strchr(temp, '\n'); 
if (newline) 
    *newline = 0; 

strchr 검색 temp, 그리고 (개행 문자가 발견되지 않는 경우 또는 NULL) 그것에 대한 포인터를 반환 다음과 같이

3

추가 \ r에 \ n을 아마`) 후행 공백을 제거하면 대부분의 휴대용은`strpbrk를 (사용하여 수행 할 수 있습니다 strtok를