Fim do arquivo * ponteiro não é igual ao tamanho dos dados gravados
Pergunta
Muito simplesmente, eu tenho o seguinte trecho de código:
FILE* test = fopen("C:\\core.u", "w");
printf("Filepointer at: %d\n", ftell(test));
fwrite(data, size, 1, test);
printf("Written: %d bytes.\n", size);
fseek(test, 0, SEEK_END);
printf("Filepointer is now at %d.\n", ftell(test));
fclose(test);
e ele gera:
Filepointer at: 0
Written: 73105 bytes.
Filepointer is now at 74160.
Por que isso? Por que o número de bytes não está escrito coincidir com o ponteiro de arquivo?
Solução
Uma vez que você está abrindo o arquivo em modo texto, ele irá converter marcadores de fim de linha, como o LF, em CR / LF.
Esta é provável se você estiver executando no Windows (e você provavelmente são, uma vez que o nome do arquivo começa com "c:\"
).
Se você abrir o arquivo em modo "wb"
, eu suspeito que você vai encontrar os números são idênticos:
FILE* test = fopen("C:\\core.u", "wb");
O padrão C99 tem a dizer em 7.19.5.3 The fopen function
:
O argumento mode aponta para uma string. Se a string é um dos seguintes, o arquivo é abrir no modo indicado. Caso contrário, o comportamento é indefinido.
r
arquivo de texto aberto para leitura
w
truncado ao comprimento zero ou cria arquivo de texto para escrever
a
acréscimo; abrir ou criar o arquivo de texto para escrever a
EOFrb
arquivo binário aberto para leitura
wb
truncado ao comprimento zero, ou cria arquivo binário para escrever
ab
acréscimo; abrir ou criar arquivo binário para escrever em
EOFr+
arquivo de texto aberto para atualização (leitura e escrita)
w+
truncado ao comprimento zero, ou cria arquivo de texto para atualização
a+
acréscimo; abrir ou criar arquivo de texto para atualização, escrevendo em
EOFr+b
ou arquivo binário abertorb+
para atualização (leitura e escrita)
w+b
ouwb+
truncar para comprimento zero ou cria arquivo binário para atualização
a+b
ouab+
acréscimo; abrir ou criar o arquivo binário para atualização, escrevendo no fim-de-arquivo
Você pode ver que eles distinguir entre w
e wb
. Eu não acredito que uma implementação é necessário para tratar os dois diferente, mas geralmente é mais seguro usar o modo binário para dados binário.
Outras dicas
O que significa retorno fwrite? Normalmente, o valor de retorno deve ser o número de bytes escritos. Além disso, o que faz a resposta ftell () com direito antes do fseek?
Pode ajudar a saber o que o sistema operacional, versão do compilador C e uma biblioteca C.
A filepointer é um cookie. Não tem nenhum valor. A única coisa que você pode usá-lo para é procurar para o mesmo lugar em um arquivo. Eu nem tenho certeza se ISO C garante que ftell retorna valores crescentes. Se você não acreditar, por favor, olhar para os diferentes modos de busca (). Eles existem, precisamente porque a posição não é um byte simples deslocamento.
janelas não realmente escrever todos os dados para o arquivo sem um flush e possivelmente um fsync. Talvez por isso