2016-07-09 4 views
0

"섬"(그리드의 연결된 점)의 그리드 좌표를 입력하고 각 섬의 질량 중심을 찾는 코드를 작성했습니다. 이 코드는 몇 개의 큰 섬이있는 그리드에 대해서는 성공적이지만, 작은 섬이 많은 그리드에는 적합하지 않습니다.C : rewind() 252 번째 시도에서 세그멘테이션 오류

나는 252 번째 루프 스루에서 실패한 rewind() 문제를 좁혔다. 왜 섬이 # 252 이전에 좌표를 인쇄하여 존재하는지 확인한 것처럼 나는 실패한 이유는 모르겠다. 252를 건너 뛰면 코드가 아일랜드 253에서 실패하기 때문에 252 회 사용 후 실패한 되감기 일 뿐이라고 생각한다.

코드는 매우 큰, 그래서 난 그냥 관련 부분 게시하려고합니다 다음에 대해 다음 다시 f는 사용

FILE *f; 

    if((f = fopen(argv[1], "r")) == NULL) 
    { 
      printf("Could not open file to read.\n"); 
      return 0; 
    } 
    while(!feof(f)) 
    { 
      fscanf(f, "%d %d  %d\n", &current_x, &current_y, &island_number); 
      if(island_number > number_of_islands) 
      { 
      number_of_islands = island_number; 
      } 
    } 
fclose(f); 

이 첫 번째 인스턴스를하지만, 나중에 다시 사용되는, 그리고 문제가 나온다입니다 루프 :

for(int i = 0; i < number_of_islands; i++) 
{ 
    printf("new loop: %d (number of islands: %d) \n", loop, number_of_islands); 

if(loop == 252) 
{ 
    printf("putting in x, y at 252...\n"); 
} 

코드가 실패하는 곳입니다 ...

//putting numbers in x and y 
    rewind(f = fopen(argv[1], "r")); 

는 여기 아래 부분의 비트 (아마하지 않는 것이 중요) :

if(loop == 252) 
{ 
    printf("rewound at 252...\n"); 
    exit(0); 
} 


    while(!feof(f)) 
    { 
      fscanf(f, "%d %d  %d\n", &current_x, &current_y, &island_number); 

      if(island_number == current_island_number) 
      { 
        x_array[current_x] += 1; 
        y_array[current_y] += 1; 

      } 
    } 

if(loop == 252) 
{ 
    printf("finished putting in x, y at 252...\n"); 
    exit(0); 
} 

이처럼 출력이 모습의 샘플 :

Everything looks good, except for the sudden segfault.

그래서 제 질문은, 왜 되감기입니다 () 갑자기 252 번째 시도에서 segfaulting?

+5

Fyi를 읽고 싶을 수도 있습니다. [왜 while (! feof (file))이 항상 잘못 되었습니까?] (https://stackoverflow.com/questions/5431941/why-is-while-feof- 파일 - 항상 - 잘못된). 그리고 @ user3121023과 동의합니다. 'fopen'의 하드 할당으로 마지막 파일을 포기했기 때문에 열린 파일 기술자가 부족한 것 같습니다. 이것은 항상 올바르게 작동한다고 가정합니다. 가정은 모든 사람들의 어머니입니다. – WhozCraig

+0

'feof'에서 파일의 끝 부분을 넘어서는 독창성을 탐구하고 싶지만 루프를 재구성하는 것이 좋습니다. 어떤 경우에는'fscanf'의 반환 값을 사용하여 루프를 제어 할 수 있습니다. 이 함수의 값을 테스트하지 않는 * faux pas *입니다. 'while (fscanf (...)! = 3) {...} '과 같은 것입니다. –

+5

256 번째 스트림을 열려고 할 때 실패 할 것 같습니다 (0..252는 253을 더하고 stdin, stdout, stderr는 256을 만듭니다) ... 당신이'fopen()'s 사이에서 파일을 닫지 않는다고 가정하면 너는 있어야한다). – Dmitri

답변

0

this : rewind (f = fopen (argv [1], "r"))); f를 되감기하지 않습니다. 대신 새 파일을 f에 할당하고 동일한 파일을 열고 되감기 (방금 열었지만)합니다. 일부 시스템에서는 열 수있는 파일 설명자에 제한이 있습니다. 왜 252? 내가 한도가 256 커널이 아마 당신이 먼저 파일을 닫거나 할 수 있습니다 문제를 해결하기 위해 나머지 4 를 사용 같아요

rewind(f); 

이이 F없이 재 할당과 함께 작동합니다.