2012-08-06 2 views
0

나는 다음과 같은 방법을 사용하여 파일의 크기를 얻으려고에 포인터를 탐색 설정 : 문제의 파일이 2GiB 이상 조금파일 크기를 얻기과 윈도우

size_t fsize = 0; 
fseek(fin, 0L, SEEK_END); 
fsize = ftell(fin); 
fseek(fin, 0L, SEEK_SET); 

입니다, 그리고 ftell은 일부를 반환 거대한 숫자.

또한 내 응용 프로그램에서는 모든 읽을 때마다 바이트 수를 다시 설정해야합니다. 나는 다음을 사용했다. i 내가 마지막 FREAD 후 파일의 끝에 도달하는 경우 일반적으로 발생해야하는 16와 동일한 경우

i = fread(inbuf, 1,readSize, fin); 
fseek(fin, -16, SEEK_CUR); 

모든 읽기 후에, 나는 확인한다. 그러나이 역시 작동하지 않고 0의 값은 i에 할당되어 탐색 포인터가 뒤로 이동하지 않았 음을 나타냅니다.

필자의 프로그램은 Linux에서 잘 작동하며 다른 읽기 및 파일 크기로 테스트되었습니다. 코드는 Linux 버전의 코드와 거의 동일합니다. 차이점은 Windows에서 C99의 stdint 라이브러리를 사용할 수 없다는 점입니다. 그 외에는 코드가 완전히 동일합니다. Linux 버전은 똑같은 테스트 파일과 읽기 크기를 사용하여 잘 작동합니다.

마지막으로, Win20에서 VS2010을 사용하는 CUDA 프로그램 (런타임 버전 4.2)을 언급해야합니다. 이것은 64 비트 프로그램입니다.

편집

이 파일은 'B'플래그와 함께 문을 열었습니다. 코드는 다음과 같습니다.

if(!(fin = fopen(argv[1], "rb"))) 
{ 
    printf("The input file: %s could not be opened\n", argv[1]); 
    err = -5; goto exit; 
} 

if(!(fout = fopen(argv[2], "wb"))) 
{ 
    printf("The output file: %s could not be opened\n", argv[1]); 
    err = -6; goto exit; 
} 

답변

1

fstat()를 사용하여 파일 크기를 가져올 수 있습니다. 크기를 계산하기 위해 파일을 읽는 것보다 낫습니다. fstat in msdn docs

EDIT : Windows에서 fstat의 동작에 대해 너무 확신하지 못합니다.

+0

그럴 수도 있지만 표준 파일 포인터 대신 파일 핸들을 사용해야합니다. 하나를 다른 것으로부터 얻을 수있는 방법이 있습니까? – sj755

+0

'FILE * '로부터 파일 기술자를 얻기 위해서'fileno' 함수를 사용하십시오. – librik

+0

http://msdn.microsoft.com/en-us/library/zs6wbdhx(v=vs.80).aspx : 작동해야합니다. stat() 시스템 호출이나 fstat()에 대해 좀 더 자세히 설명합니다 :이 함수를 사용한다면 불필요한 디스크 접근을 피할 수 있습니다. 파일 크기는 보유하고있는 파일에 관한 메타 데이터 중 하나 일뿐입니다 메모리에. – Arvind

0

O_BINARY과 함께 파일을 열면 도움이 될 수 있습니다. 그렇지 않으면 libne 나누기 및 EOF 문자에 문제가 발생할 수 있습니다.

+0

OP는'FILE'과 아마'fopen'을 사용하기 때문에, 모드 문자열은 같은 일을하는''b "'를 포함해야합니다. –

+0

그것은 @ JoachimPileborg가 말한 것과 같습니다. 나는 fopen을 사용하고 있었지만, 파일은 이미''b "'플래그로 열렸다. 질문을 업데이트했습니다. – sj755