1. A diferença entre abrir e fopen, fechar e fclose
2. A diferença entre ler e ler, escrever e escrever
4. Uso de creat, fgetc, fputc, feof
Prefácio
Esta é a experiência de aprendizado registrada ao aprender a programar o sistema de arquivos Linux.
Do ponto de vista da fonte, funções como open são diferentes de funções como fopen:
open
É uma função de chamada do sistema LUNIX que retorna um descritor de arquivo (File Descriptor), que é o índice do arquivo na tabela de descritores de arquivo.fopen
É uma função de biblioteca da linguagem C no padrão ANSIC e deve chamar diferentes APIs de kernel em diferentes sistemas. O que é retornado é um ponteiro para a estrutura do arquivo.
Do ponto de vista da portabilidade: fopen é uma função padrão C e tem boa portabilidade; enquanto open é uma chamada de sistema LUNIX e tem portabilidade limitada. Para funções semelhantes no Windows, use a função API `CreateFile`.
Do escopo de aplicação: open retorna o descritor de arquivo.Todos os dispositivos no LUNIX operam na forma de arquivos. Como soquetes de rede, dispositivos de hardware, etc. Claro, incluindo a operação de arquivos regulares (Arquivo Regular). fopen é usado para manipular arquivos regulares (Arquivo Regular)
Do ponto de vista do buffer: open
sem buffer, fopen
com buffer. O sistema de arquivos em buffer usa ponteiros de estrutura de arquivo para gerenciar arquivos, e os arquivos são acessados por meio de ponteiros de arquivo. Buffer significa operar primeiro no buffer e depois no arquivo. Por exemplo, ao executar uma operação de gravação de arquivo, os dados são primeiro gravados no "buffer" da memória e, em seguida, os dados são gravados no arquivo depois que o "buffer" da memória estiver cheio. O sistema de arquivos sem buffer depende do sistema operacional e lê e grava arquivos por meio das funções do sistema operacional, que são entradas e saídas no nível do sistema.
1. A diferença entre abrir e fopen, fechar e fclose
open e close são usados juntos, fopen e fclose são usados juntos
int open(const char *nome do caminho, int flags);
ARQUIVO *fopen(const char *caminho, const char *modo);
A função open retorna o descritor de arquivo, que é o índice do arquivo. fopen retorna o ponteiro do arquivo, que é acessado através do ponteiro do arquivo.
int fechar(int fd);
int fclose(ARQUIVO *fp);
Os dois métodos de uso são semelhantes.
2. A diferença entre ler e ler, escrever e escrever
ssize_t read(int fd, void *buf, size_t contagem);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ssize_t write(int fd, const void *buf, size_t contagem);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr é o buffer, fwrite grava os dados do buffer no arquivo e fread lê os dados do arquivo no buffer.
O valor de retorno de leitura e gravação é o tamanho do byte lido e gravado, e o valor de retorno de fread e fwrite depende do terceiro parâmetro: o número de leituras e gravações.
3. Uso de lseek e fseek
off_t lseek(int fd, off_t offset, int de onde);
int fseek(FILE *stream, deslocamento longo, int de onde);
Ambos são usados da mesma forma, int de onde tem três posições:
o cursor SEEK_SET aponta para a cabeça, o cursor SEEK_CUR aponta para a posição atual, o cursor SEEK_END aponta para a cauda
offset é o deslocamento relativo à posição. Os números negativos do deslocamento avançam e os números positivos movem-se para trás.
lseek(fd,0,SEEK_END) usa seu valor de retorno para calcular o tamanho do arquivo.
4. Uso de creat, fgetc, fputc, feof
int creat(const char*nome do caminho,modo mode_t)
Caminho absoluto Modo: Representação de macro Número
S_IRUSR 4 Legível
S_IWUSR 2 Gravável
S_IXUSR 1 Executável
S_IRWXU 7 Legível, gravável e executável
int fputc(int c, ARQUIVO *stream);
Escreva um caractere no fluxo do arquivo fp. Para escrever vários caracteres, você pode usar um loop para escrever um por um.
int fgetc(ARQUIVO *fluxo);
Para obter um caractere do arquivo, você pode fazer um loop para obter os caracteres um por um, com feof
int feof(ARQUIVO *fluxo);
Determine se o fim do fluxo de arquivos foi atingido. O valor de retorno será 0 se o fim não for atingido. O valor de retorno será diferente de 0 quando o fim for atingido.
do
{
c = fgetc(fp);
if( feof(fp) )
{
break ;
}
printf("%c", c);
}while(1);
Artigo de referência: https://www.cnblogs.com/NickyYe/p/5497659.html