paulo1205
(usa Ubuntu)
Enviado em 10/06/2015 - 23:46h
Eu sei que já até se deu o tópico por encerrado, mas não posso deixar de notar que a solução de ler com
scanf() é incompatível com algumas dicas dadas na exposição do problema original, que sugerem que se está trabalhando com um arquivo binário. Contribuem para essa impressão o sufixo ".bin"no nome do arquivo, o modo de abertura "rb" e o uso de
fread() para a leitura e o fato de ter de se fazer a atualização dos salários interativamente (o que eu entendo como sobrescrever no próprio arquivo os registros que tiverem de ser alterados, o que é mais fácil de fazer com registros de tamanho fixo do que com arquivo de texto).
Por outro lado, a forma como
fread() fora usada estava completamente errada, com divergência entre o tipo do ponteiro do primeiro argumento e os valores usados no segundo e no terceiro. Também a menção a estrutura de vetores estava errada, pois o que se tinha era um vetor de estruturas. O laço de repetição trabalhava exclusivamente em memória, e não com o arquivo. Por fim, o formato em que é mostrado o conteúdo do arquivo
parece com arquivo de texto (se bem que eu não sei se a resposta ao pedido feito pelo Thiago de mostrar o arquivo foi só para dar uma ideia do que há nele ou se é uma transcrição literal do seu conteúdo).
Uma receita simples e geral é: se o arquivo tiver sido gerado com
fwrite(), ele deve ser lido com
fread(), e ambas as funções requerem modo binário no momento da abertura do arquivo; se gerado com funções de escrita de texto, como
fprintf() e fputs
() (ou construído com um editor de texto puro, como o vim ou o Notepad do Windows), deve ser lido com funções de leitura, como [i]fscanf() e
fgets(), e o arquivo deve ser aberto em modo texto. Se for um arquivo de texto, não é possível ler todos os registros do array de uma vez só, e será necessário ler registro por registro (ou, na verdade, campo por campo), até se chegar ao final do arquivo, contando os registros um a um, para saber a quantidade deles que há no arquivo.
A lógica de identificação e informação sobre a busca do registro desejado estava errada. Só se deveria imprimir que o registro não foi encontrado uma vez, depois de ter saído do laço de repetição sem ter encontrado o registro que se queria.