Compartilhamento de tecnologia

[Linguagem C] Brinque com operações de arquivo

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

🌟🌟Página inicial do autor:efêmeros__

🌟🌟Coluna pertencente:Linguagem C

Índice

introdução

1. Abrindo e fechando arquivos

1. fluxo

2. Fluxo padrão

3. Arquivos de texto e arquivos binários

4. Funções que controlam a abertura e fechamento de arquivos

2. Leitura e gravação sequencial de arquivos

3. Leitura e gravação aleatória de arquivos

1.função fseek

Função 2.ftell

3. função de retrocesso

4. Determinação do fim da leitura do arquivo

Resumir


introdução

Quando escrevemos programas, frequentemente armazenamos dados em variáveis. Se o programa for encerrado e a memória for recuperada, esses dados serão perdidos. Então, existe uma maneira de salvarmos persistentemente esses dados para que eles ainda existam quando o programa for aberto novamente? A resposta é sim. O que pode fazer isso é:Operações de arquivo

1. Abrindo e fechando arquivos

1. fluxo

Os dados do programa precisam ser enviados para dispositivos externos e também precisam ser inseridos a partir de dispositivos externos. Para dispositivos diferentes, os métodos de entrada e saída são diferentes. Para facilitar nossas operações em diversos dispositivos de entrada e saída, temos o conceito altamente abstrato de “stream”. Na linguagem C, as operações de entrada e saída em arquivos, telas, teclados, etc. são todas realizadas através de "streams". Em geral, se quisermos gravar ou ler dados, precisamos abrir o fluxo.

2. Fluxo padrão

Quando um programa em linguagem C é iniciado, o padrão étrês fluxosJá abriu para nós:

padrão--Fluxo de entrada padrão, entrada do teclado na maioria dos casos.

saída padrão--Fluxo de saída padrão, saída para o monitor na maioria dos casos.

padrão--Fluxo de erro padrão, saída para o monitor na maioria dos casos.

Como esses três fluxos foram abertos por padrão, podemos realizar operações de entrada e saída diretamente usando funções como scanf e printf.

Esses três fluxos também possuem tipos. Seus tipos são:Ponteiro de arquivo (FILE*) .Quando realizamos operações de arquivo, passamosA variável ponteiro de arquivo pode encontrar indiretamente o arquivo associado a ela.

3. Arquivos de texto e arquivos binários

Dependendo de como os dados são organizados, os arquivos de dados são chamadosarquivo de textoouarquivo binário . Os dados são armazenados em formato binário na memória,Se for enviado para um arquivo de armazenamento externo sem conversão, éarquivo binário
Se for necessário armazená-lo em código ASCII em armazenamento externo, ele precisará ser convertido antes do armazenamento.Um arquivo armazenado na forma de caracteres ASCII éarquivo de texto
Como um dado é armazenado em um arquivo?
Os caracteres são sempre armazenados no formato ASCII e os dados numéricos podem ser armazenados no formato ASCII ou binário. Por exemplo, se houver um número inteiro 10000, se for enviado para o disco na forma de código ASCII, ele ocupará 5 bytes no disco (um byte para cada caractere), enquanto se for enviado em formato binário, será ocupará apenas 4 bytes no disco.

4. Funções que controlam a abertura e fechamento de arquivos

Depois de compreender esse conhecimento pré-requisito, vamos direto ao ponto: abrir e fechar arquivos. A linguagem C fornece duas funções, que são responsáveis ​​​​por abrir e fechar arquivos respectivamente. Os protótipos são os seguintes:

abra um arquivo:
ARQUIVO * abrir ( const char * nome do arquivo, const char * modo );
Feche o arquivo:
Inteiro fechar ( ARQUIVO * fluxo );

A função fopen possui dois parâmetros,O primeiro parâmetro é expresso na forma de uma stringnome do arquivo, o segundo parâmetro é o arquivoMétodo aberto, representado por uma string .Ao usar esta função, precisamos criar umvariável de ponteiro de arquivo Para receber, quando o arquivo não abre, ele retorna um ponteiro nulo. Em relação aos métodos de abertura, aqui estão os seguintes:

Método abertosignificadoSe o arquivo especificado não existir
"r" (somente leitura)
Para inserir dados, abra um arquivo de texto existente
Retorna um ponteiro nulo
"w" (somente gravação)
Para gerar dados, abra um arquivo de texto
Crie um novo arquivo
"a" (anexar)Adicione dados ao final do arquivo de textoCrie um novo arquivo
"rb" (somente leitura)Para inserir dados, abra um arquivo binárioRetorna um ponteiro nulo
"wb" (somente gravação)Para gerar dados, abra um arquivo binárioCrie um novo arquivo
"ab" (anexar)Adicione dados ao final de um arquivo binárioCrie um novo arquivo
"r+" (ler e escrever)Para ler e escrever, abra um arquivo de textoRetorna um ponteiro nulo
"w+" (ler e escrever)Para leitura e escrita, crie um novo arquivo de textoCrie um novo arquivo
"a+" (ler e escrever)Abra um arquivo e leia e escreva no final do arquivoCrie um novo arquivo
"rb+" (ler e escrever)Abra um arquivo binário para leitura e gravaçãoRetorna um ponteiro nulo
"wb+" (ler e escrever)
Para leitura e escrita, crie um novo arquivo binárioCrie um novo arquivo
"ab+" (ler e escrever)
Abra um arquivo binário e leia e escreva no final do arquivoCrie um novo arquivo

Para a função fclose, seu parâmetro é o ponteiro de arquivo, que serve para fechar o arquivo apontado pelo ponteiro de arquivo.

A seguir, tentamos abrir e fechar um arquivo:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. FILE* pf = fopen("test.txt", "w");
  5. if (pf == NULL)//文件打开失败则退出程序
  6. {
  7. perror("fopen");
  8. return 0;
  9. }
  10. printf("文件打开成功n");
  11. fclose(pf);
  12. pf = NULL;//避免出现野指针,及时制空
  13. return 0;
  14. }
resultado da operação:

Pode-se observar que como o método de abertura é “w”, um arquivo denominado “test.txt” aparece no caminho.

2. Leitura e gravação sequencial de arquivos

A seguir, apresentamos diversas funções paraLer ou gravar dados em um arquivo

Nome da funçãoFunçãoAplicável a
fgetcFunção de entrada de caracteresTodos os fluxos de entrada
fputcfunção de saída de caracteresTodos os fluxos de saída
Fgets (obtém)Função de entrada de linha de textoTodos os fluxos de entrada
resultadosFunção de saída de linha de textoTodos os fluxos de saída
fscanfFunção de entrada de formatoTodos os fluxos de entrada
fimprimirfFunção de saída de formato Todos os fluxos de saída
medoEntrada bináriaFluxo de entrada de arquivo
escreverSaída bináriaFluxo de saída de arquivo

A seguir tentamos usarfscanfefimprimirffunção:

O primeiro parâmetro dessas duas funções é um ponteiro de arquivo, usado para ler e gravar dados de arquivo. Os parâmetros subsequentes são iguais às funções scanf e printf.

  1. #include <stdio.h>
  2. int main()
  3. {
  4. FILE* pf = fopen("test.txt", "w");//要写入数据,以写的形式打开文件
  5. if (pf == NULL)
  6. {
  7. perror("fopen");
  8. return 0;
  9. }
  10. fprintf(pf, "123456");//向文件中写入数据
  11. fclose(pf);
  12. pf = NULL;
  13. return 0;
  14. }

Como você pode ver, os dados foram gravados no arquivo. A seguir usamos a função fscanf para imprimir os dados do arquivo na tela:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char str[20] = { 0 };
  5. FILE* pf = fopen("test.txt", "r");//要读取数据,以读的形式打开文件
  6. if (pf == NULL)
  7. {
  8. perror("fopen");
  9. return 0;
  10. }
  11. fscanf(pf, "%s", str);//读取数据到str当中
  12. printf(str);
  13. fclose(pf);
  14. pf = NULL;
  15. return 0;
  16. }
resultado da operação:

3. Leitura e gravação aleatória de arquivos

1.função fseek

A função da função fseek éCom base na posição e deslocamento do ponteiro do arquivoposiçãoponteiro de arquivo . Seu protótipo é o seguinte:

int fseek (ARQUIVO * fluxo, longo int deslocamento, int origem);

Seu primeiro parâmetro é o ponteiro do arquivo, o segundo parâmetro é o deslocamento relativo à posição definida e o terceiro parâmetro é a posição definida.

A linguagem C define trêsmacro, você pode escolher um deles como terceiro parâmetro:

SEEK_SET: posição inicial do arquivo

SEEK_CUR: A posição atual do ponteiro do arquivo

SEEK_END: ​​​​fim do arquivo

Depois de localizar o ponteiro do arquivo, podemos ler ou escrever no local especificado do arquivo.

Função 2.ftell

A função ftell é usada para retornarO deslocamento do ponteiro do arquivo em relação à posição inicial . Protótipo de função:

longo int ftell (ARQUIVO * fluxo);

3. função de retrocesso

A função de retrocesso é usada paraRetorne a posição do ponteiro do arquivo para o início do arquivo . Seu protótipo de função:

void rewind (ARQUIVO * fluxo);

4. Determinação do fim da leitura do arquivo

1. Paraarquivo de texto, podemos primeiro usarfgetcA função percorre os caracteres do arquivo até que EOF seja lido, indicandoA leitura do arquivo termina

2. Paraarquivo binário,Nós usamosmedoA função determina seu valor de retorno:É menor que o número real a ser lido? .Se for menor queA leitura termina.

Para os dois casos acima, o arquivoNo final da leitura, podemos continuar a julgarRazão pela qual a leitura do arquivo terminou . Apresente duas funções:feofeferro

feofFunção usada paraDeterminar o fim da leitura do arquivorazãoindependente da respostaFim do arquivo encontrado . Seu protótipo é o seguinte:

int feof ( ARQUIVO * fluxo );

Se o arquivo for devido aLer até o final do arquivoQuando a leitura for concluída, EOF é retornado; nos demais casos, 0 é retornado.

        ferroFunção usada paraDeterminar o fim da leitura do arquivorazãoindependente da respostaOcorreu um erro de E/S . O protótipo é o seguinte:

int ferror ( ARQUIVO * fluxo );

Se o arquivo for devido aOcorreu um erro de E/SQuando a leitura é concluída, um valor diferente de zero é retornado; nos demais casos, 0 é retornado.

Em seguida, tentamos escrever um trecho de código para julgar o final da leitura do arquivo:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int c = 0;
  5. FILE* fp = fopen("test.txt", "r");
  6. if (fp == NULL)
  7. {
  8. perror("fopen");
  9. return 0;
  10. }
  11. while ((c = fgetc(fp)) != EOF)//返回EOF则读取结束
  12. {
  13. putchar(c);
  14. }
  15. //判断读取结束的原因
  16. if (ferror(fp))
  17. puts("I/O错误n");
  18. else if (feof(fp))
  19. puts("文件读取结束n");
  20. fclose(fp);
  21. fp = NULL;
  22. return 0;
  23. }

Resumir

Hoje aprendemos sobre operações de arquivos, como abrir e fechar arquivos, gravar ou ler dados de arquivos, funções para ajustar ponteiros de arquivos e determinar o final da leitura de arquivos. Se você acha que o que o blogueiro disse é bom, deixe um pequeno like e obrigado pelo seu apoio❤❤❤