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?

Foi útil?

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
EOF rb 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
EOF r+ 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
EOF r+b ou arquivo binário aberto rb+ para atualização (leitura e escrita)
w+b ou wb+ truncar para comprimento zero ou cria arquivo binário para atualização
a+b ou ab+ 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top