2012-11-05 3 views
2

이 중첩 된 while 루프가 있는데, 파일에서 라인을 읽어 들여 인접 목록을 만듭니다. 문제는 내부 루프가있는 것 같지 않습니다. 내부 루프를 통과하기 때문에 발생하지만, 파일의 마지막 지점을 인접 목록에 저장하기 전에 실행이 중지됩니다. 필자는 크기가 다른 여러 파일로 테스트 해봤습니다. 가장 마지막 시점 이전에 항상 옳았습니다. 나는 왜 그 일을 할 지 알 수는 없지만 다른 누군가가 나를 도울 수 있습니까?While 루프가 끝나기 전에 항상 멈춰 있습니다.

파일의 행은 current-> 다음 배열에 잘 저장되어 있습니다. 문제가있는 newPt 인접 목록 중 마지막 행입니다. 사실, 마지막으로 while 루프에 들어가기 때문에 마지막 두 줄을 실행하는 것처럼 보이지 않습니다.

struct line { 
     int u; 
     int v; 
     int w; 
     int useful; 
     struct line *next; 
    }; 
    struct adjacent { 
     int x; 
     int onqueue; 
     struct adjacent *adj; 
    }; 
    struct adjacent *aList[num+1]; 
    struct line *current; 
    struct adjacent *currentPt; 
+0

이 코드에서 오류 검사가 없으므로 여러 가지 일이 잘못되어 디버그하기가 어려울 수 있습니다. 1 : "aList [u]"가 오버플로가 아니도록 "u"가 올바른 범위에 있는지 확인하십시오. 2 : "% d"는 아마 "% u"이어야합니다. 음수를 원하지 않으므로 적어도 "u"는 "% u"여야합니다. 3 : "aList"는 어떻게 초기화됩니까? 이웃입니까? aList [SIZE]; 또는 인접 * aList [SIZE]; ? 후자의 경우이 항목을 어떻게 초기화합니까? "SIZE"더미 노드를 할당 할 것인가? – joeking

+0

"달리기 중지"란 무엇을 의미합니까? 그것은 잘못 되었습니까? 아니면 종료합니까? –

+0

@joeking 이들 모두는 프로그램이 사용하려는 파일을 기반으로 계산됩니다. 음수는 없으며 (그래프에 정점으로 표시), aList는 지정된 정점 수 인 num을 사용하여 초기화되고 모든 정점은 건너 뛰지 않고 보통 순서 1, 2, 3 등으로 계산됩니다 아무것도. –

답변

1

당신은 더 밀접하게 fscanf의 반환 값을 확인해야합니다 : 그 도움이된다면

while(fscanf(fptr, "%d %d %d", &u, &v, &w) != EOF) { //read from file 
    current->next=malloc(sizeof(struct line)); 
    current=current->next; 
    current->u=u; 
    current->v=v; 
    current->w=w; 
    current->useful=0; 
    //add point to adjacency list 
    currentPt=aList[u]; 
    while((currentPt->adj)!=NULL) { 
     currentPt=currentPt->adj; 
    } 
    newPt=malloc(sizeof(struct adjacent)); 
    newPt->x=v; 
    newPt->adj=NULL; 
    currentPt->adj=newPt; 
} 

은, 내가 사용 구조입니다. 파일 끝에있는 경우 EOF을 반환합니다. 그러나 3 회의 성공적인 전환을 나타 내기 위해 3을 반환해야합니다. 예를 들어, 파일이 공백 행으로 끝나는 경우 0을 반환 할 수 있습니다.

+0

그래, while (fscanf == 3)으로 변경했지만 여전히 동일한 문제가 있습니다. 그게 당신이 의미 한 것입니까? –

+0

예,이 같은 소리는 문제가 아닙니다. –

-1

당신이 방법 다음 시도 할 수 ..

while(!feof(fptr)) 
{ 
fscanf(fptr, "%d %d %d", &u, &v, &w); 
//Rest of your code in while loop 
} 

이 작동하는지 알려주세요.

디버깅을 위해서
+0

오, 그게 흥미 롭 네요, 내가 할 경우, 그것은 while 루프의 끝을 통과하지만 실제로 파일의 마지막 줄에서 두 번째 데이터를 다시 읽습니다. 어쩌면 내가받은 파일에 끝 부분에 빈 줄이 있기 때문일까? 어떻게 그 일을 그만 둘 것인가에 대한 생각? –

+0

(두 번째 마지막 줄에서 데이터를 읽는 동안 다시 멈 춥니 다.) –

+0

@KristinMarks :이 코드를 무시하면 잘못된 방법으로 EOF를 처리 할 수 ​​있습니다. – Blastfurnace

0

, 당신은 중간 상태를 인쇄 라인을 추가 할 수 있습니다

루프 동안 외부의 끝에서

printf("%d %d %d %p &p\n", u, v, w, current, currentPt); 

를 추가합니다.

관련 문제