"섬"(그리드의 연결된 점)의 그리드 좌표를 입력하고 각 섬의 질량 중심을 찾는 코드를 작성했습니다. 이 코드는 몇 개의 큰 섬이있는 그리드에 대해서는 성공적이지만, 작은 섬이 많은 그리드에는 적합하지 않습니다.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", ¤t_x, ¤t_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", ¤t_x, ¤t_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?
Fyi를 읽고 싶을 수도 있습니다. [왜 while (! feof (file))이 항상 잘못 되었습니까?] (https://stackoverflow.com/questions/5431941/why-is-while-feof- 파일 - 항상 - 잘못된). 그리고 @ user3121023과 동의합니다. 'fopen'의 하드 할당으로 마지막 파일을 포기했기 때문에 열린 파일 기술자가 부족한 것 같습니다. 이것은 항상 올바르게 작동한다고 가정합니다. 가정은 모든 사람들의 어머니입니다. – WhozCraig
'feof'에서 파일의 끝 부분을 넘어서는 독창성을 탐구하고 싶지만 루프를 재구성하는 것이 좋습니다. 어떤 경우에는'fscanf'의 반환 값을 사용하여 루프를 제어 할 수 있습니다. 이 함수의 값을 테스트하지 않는 * faux pas *입니다. 'while (fscanf (...)! = 3) {...} '과 같은 것입니다. –
256 번째 스트림을 열려고 할 때 실패 할 것 같습니다 (0..252는 253을 더하고 stdin, stdout, stderr는 256을 만듭니다) ... 당신이'fopen()'s 사이에서 파일을 닫지 않는다고 가정하면 너는 있어야한다). – Dmitri