Quais são as diferenças entre as operações de arquivo do Linux abrir, fechar, escrever, ler, criar, lseek e fopen, fread, fwrite, fseek, fclose, fgetc, fputc, feof e antes?

Prefácio

1. A diferença entre abrir e fopen, fechar e fclose

2. A diferença entre ler e ler, escrever e escrever

3. Uso de lseek e fseek

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: opensem buffer, fopencom 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

   


Acho que você gosta

Origin blog.csdn.net/qq_44848795/article/details/121907858
Recomendado
Clasificación