A última nota escreveu sobre a função fopen e a função fclose.Nesta nota, escrevemos a função fgetc_fputc, a função fgets_fputs e a função fread_fwrite.
1. Leia e escreva um caractere de cada vez
Declaração de função:
int fgetc(FILE *stream);
Descrição da função:
fgetc lê um byte do arquivo identificado por stream e retorna o valor do byte.
valor de retorno:
Na forma de t: leia o final do arquivo e retorne EOF (EOF é uma constante simbólica definida no arquivo stdio.h, o valor é -1)
No caminho de b: leia o final do arquivo, use feof (ponteiro de arquivo) para julgar o final
feof é uma função de biblioteca padrão da linguagem C. Seu protótipo está em stdio.h. Sua função é detectar o fim do arquivo no fluxo. Se o arquivo terminar, ele retornará um valor diferente de zero, caso contrário, retornará 0.
Declaração de função:
int fputc(int c,FILE *stream)
Descrição da função:
fputc grava o valor de c no arquivo representado por stream.
valor de retorno:
Se a saída for bem-sucedida, retorne o valor do byte da saída
Retorna um EOF se a saída falhar
※※Nota: Ao abrir um arquivo, a posição de leitura e gravação padrão é no início do arquivo. Se a posição de leitura e gravação for aberta na forma de um no final do arquivo, a posição de leitura e gravação será para o arquivo ao ler ou gravar bytes no arquivo. O deslocamento final, quantos bytes ler, quantos bytes a posição de leitura e gravação é deslocada para o final do arquivo.
exemplo:
#include<stdio.h>
int main()
{
FILE *fp1,*fp2;
char ch;
fp1=fopen("test.txt","r");
if(fp1==NULL)
{
perror("fopen");
return 0;
}
fp2=fopen("test2.txt","w");
if(fp2==NULL)
{
perror("fopen");
return 0;
}
while((ch=fgetc(fp1))!=EOF)
{
fputc(ch,stdout);
fputc(ch,fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
Conteúdo no arquivo test.txt:
O arquivo test2.txt era originalmente um arquivo vazio. Após executar o programa acima, o conteúdo do arquivo test2.txt:
Nota: Se não houver um arquivo test2.txt, um arquivo test2.txt vazio será criado primeiro.
Segundo, leia e escreva uma string de cada vez
char *fgets(char *s,int size,FILE *stream);
Leia os caracteres do arquivo identificado pelo fluxo e pare de ler quando uma nova linha for encontrada ou o final do arquivo for encontrado, ou bytes de tamanho 1 são lidos para parar a leitura e o conteúdo é lido. Um '\0' será adicionado depois dele como o final da string.
valor de retorno:
Retorna com sucesso o primeiro endereço da matriz, ou seja, s.
Retorna NULL em caso de falha.
int fputs(const char *s,FILE *stream);
Função função:
Grava a string apontada por s no arquivo representado por stream.
valor de retorno:
Retorna o número de bytes gravados com sucesso.
Retorna -1 em caso de falha.
exemplo:
#include<stdio.h>
int main()
{
FILE* fp_read,*fp_write;
char str[100];
fp_read=fopen("test.txt","r");
if(fp_read==NULL)
{
perror("fopen");
return 0;
}
fp_write=fopen("dest.txt","w");
if(fp_write==NULL)
{
perror("fopen");
return 0;
}
fgets(str,6,fp_read);
printf("str=%s\n",str);
fputs(str,fp_write);
return 0;
}
Conteúdo no arquivo test.txt:
O conteúdo do arquivo dest.txt após a execução do programa acima:
Se o 6 em fgets(str,6,fp_read) for alterado para 16, o conteúdo no arquivo dest.txt:
A razão pela qual eu só leio dez caracteres é porque há uma nova linha depois de helloworld.
Terceiro, leia o arquivo fread
Declaração de função:
size_t_fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
Descrição da função:
A função fread lê os dados do arquivo identificado por stream, cada bloco tem bytes de tamanho, um total de blocos nmemb, e é armazenado na memória apontada por ptrh.
Valor de retorno: O número real de blocos lidos.
exemplo:
unsigned int num;
num=fread(str,100,3,fp);
O conteúdo lido do arquivo representado por fp é armazenado na memória apontada por str, e o número de bytes lidos é de 100 bytes por bloco, 3 blocos. Valor de retorno num:
Se 300 bytes são lidos, o valor de retorno é 3
Se o número de bytes lidos for maior ou igual a 200 e menor que 300, o valor de retorno será 2
Se o número de bytes lidos for maior ou igual a 100 e menor que 200, o valor de retorno será 1
Retorna 0 para menos de 100 bytes.
Quarto, escreva o arquivo fwrite
Declaração de função:
size_t fwrite(void *ptr,size_t size,size_t nmemb,FILE *stream);
Descrição da função:
A função fwrite grava os dados na memória apontada por ptr para o arquivo identificado por stream, um bloco é bytes de tamanho e um total de blocos nmemb.
Valor de retorno: O número real de blocos gravados.
exemplo:
#include<stdio.h>
struct stu
{
char name[10];
int num;
int age;
}stu1[2],stu2[2];
int main()
{
FILE *fp;
int i;
fp=fopen("student.txt","wb+");//把文件当作二进制文件打开
if(fp==NULL)
{
perror("fopen");
return 0;
}
for(i=0;i<2;i++)
{
scanf("%s %d %d",stu1[i].name,&(stu1[i].num),&(stu1[i].age));
}
fwrite(stu1,sizeof(struct stu),2,fp); //将学生信息写入文件中
rewind(fp); //文件指针经过写操作已经到了最后,需要复位
fread(stu2,sizeof(struct stu),2,fp); //将文件中的数据读入内存中
printf("%s %d %d\n",stu2[0].name,stu2[0].num,stu2[0].age);
printf("%s %d %d\n",stu2[1].name,stu2[1].num,stu2[1].age);
return 0;
}
※※Perceber:
A função fwrite é a saída dos dados na memória para o arquivo como está.
A função fread lê os dados do arquivo na memória como estão. (ler byte a byte)
Cinco, leitura e escrita aleatória
Funções para completar o posicionamento do arquivo: retroceder, funções fseek
1. rebobinar redefinir a posição de leitura e gravação
função de retrocesso: void retroceder (ponteiro de arquivo);
Função: move o ponteiro de posição interna do arquivo para o início do arquivo
Formulário de chamada: rewind(ponteiro de arquivo);
exemplo:
fwrite(pa,sizeof(struct stu),2,fp);
rebobinar(fp);
fread(pb,sizeof(struct stu),fp);
2. ftell mede o número de bytes desde o início do arquivo até a posição de leitura e gravação do arquivo
Definir função: long ftell(ponteiro de arquivo);
Função: Obtém a posição atual de leitura e gravação do fluxo de arquivos
Valor de retorno: Retorna a posição atual de leitura/gravação (o número de bytes desde o início do arquivo), ou -1 em caso de erro.
exemplo:
comprimento int longo;
comprimento =ftell(fp);
3.fseek ponteiro de posição de posicionamento (posição de leitura e gravação)
função fseek (geralmente usada para arquivos binários, ou seja, a maneira de abrir arquivos requer b)
Declaração de função:
int fseek(FILE *stream,long offset,int de onde);
int fseek(ponteiro de tipo de arquivo, deslocamento, ponto inicial);
O deslocamento é um número positivo para deslocamento até o final do arquivo e um número negativo para deslocamento para o início do arquivo.
Função: Mova a posição de leitura e gravação do fluxo de arquivos.
posição inicial de onde
início do arquivo | SEEK_SET | 0 |
local atual do arquivo | SEEK_CUR | 1 |
fim do arquivo | SEEK_END | 2 |