2012-07-10 2 views
1

파일에서 정수를 읽는 코드입니다. 동일한 코드를 사용하여 다른 파일 에서 double을 읽었으며 완벽하게 작동했지만 이번에는 루프가 무한대로 바뀌 었습니다. 뭐가 될 수 있니? 제가 읽은 파일 은 프로그램에 의해 작성되었습니다, 그럴 수 있습니까? 나는 모른다. 이것은 무엇을 의미 하나 내 OS는 파일이 바이너리라고 말합니다. 글쎄, 어떤 도움을 주시면 감사하겠습니다. 감사. 당신의 파일을 읽을 수없는 바이너리 형식 scanf에있는 경우C에서 파일 읽기

i=1; 
cadeia = malloc (i * sizeof(int)); 
if (!cadeia){ //Avalia se a alocação de memória foi bem sucedida 
    printf("Problema na alocação de memória para cadeia."); 
    exit(0); 
} 
while (!feof(arq_cadeia)){ /*Fazendo leitura e alocação de memória da matriz de transição*/ 
    fscanf (arq_cadeia , "%d" , (cadeia+i-1)); 
    i++; 
    cadeia = realloc (cadeia , i * sizeof(int)); 
    if (!cadeia){ //Avalia se a alocação de memória foi bem sucedida 
    printf("Problema na alocação de memória para cadeia."); 
    exit(0); 
    } 
    printf("%d\n", *(cadeia+i-1)); 
} 
+1

'fscanf'의 결과를 확인하고 1과 같아야합니다. –

+4

'while (! feof (arq_cadeia))'에 대해서'feof'가 참이된다는 것에주의하십시오. 파일 끝. 당신의 루프에서'fscanf'의 반환 값을 확인하십시오. 유효하지 않은 입력을 발견하면 스트림에 남아 있고 모든 후속 스캔은 실패합니다. –

+0

여기에있는 문제와 관련이 없지만 버퍼를 더 큰 단위로 할당하고, 청크를 미리 할당하고, 청크에 realloc을 추가로해야하는 경우를 고려해야합니다. – pstrjds

답변

2

당신의 직감이 맞다. 텍스트 편집기 (예 : 메모장)로 숫자를 볼 수없는 경우 scanf도 읽을 수 없습니다.

프로그램에는 다른 문제가 있습니다. 숫자를 읽을 때마다 전체 배열을 다시 할당하는 것은 대단히 비효율적입니다! 가장 간단한 것은 당신이 그것을 필요로하지 않을 정도로 많은 공간을 할당하는 것입니다 (당신이 꼭대기에 오르지 않는 한 "낭비"에 대해 걱정하지 마십시오). 두 번째로 가장 간단한 방법은 파일의 크기를 측정하고 (stat 또는 그 일부가 필요함) 파일에있는 정수의 수를 추정하는 것입니다. 셋째, 가장 간단한 방법은 10000 개의 정수를 할당하고, 부족한 시간을 조심스럽게 확인하고 이미 두 배를 할당하는 것입니다.

+0

아주 좋습니다! 도와 주셔서 대단히 감사합니다. – Rodolfo

0

텍스트 모드로 작성되었다고 가정하고 정수를 읽는 중입니다. 파일이 텍스트 파일인지 여부 또는 의심되는 바이너리 파일인지 확인하십시오. 텍스트 편집기로 열어 내용을 읽을 수 있으면 텍스트 파일입니다. 그렇지 않으면 바이너리 파일을 읽으려면 프로그램을 조정해야합니다.

+0

의견에서 말했듯이 : 모든 파일은 바이너리입니다. 파일이 아닌 액세스 모드가 변경되었습니다. – m0skit0

+0

니스, 감사합니다 !!! – Rodolfo