minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
🌟🌟Página inicial do autor:efêmeros__
🌟🌟Coluna pertencente:Linguagem C
1. Abrindo e fechando arquivos
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
4. Determinação do fim da leitura do arquivo
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。
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.
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.。
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.
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 aberto | significado | Se 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 texto | Crie um novo arquivo |
"rb" (somente leitura) | Para inserir dados, abra um arquivo binário | Retorna um ponteiro nulo |
"wb" (somente gravação) | Para gerar dados, abra um arquivo binário | Crie um novo arquivo |
"ab" (anexar) | Adicione dados ao final de um arquivo binário | Crie um novo arquivo |
"r+" (ler e escrever) | Para ler e escrever, abra um arquivo de texto | Retorna um ponteiro nulo |
"w+" (ler e escrever) | Para leitura e escrita, crie um novo arquivo de texto | Crie um novo arquivo |
"a+" (ler e escrever) | Abra um arquivo e leia e escreva no final do arquivo | Crie um novo arquivo |
"rb+" (ler e escrever) | Abra um arquivo binário para leitura e gravação | Retorna um ponteiro nulo |
"wb+" (ler e escrever)
| Para leitura e escrita, crie um novo arquivo binário | Crie um novo arquivo |
"ab+" (ler e escrever)
| Abra um arquivo binário e leia e escreva no final do arquivo | Crie 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:
- #include <stdio.h>
-
- int main()
- {
- FILE* pf = fopen("test.txt", "w");
- if (pf == NULL)//文件打开失败则退出程序
- {
- perror("fopen");
- return 0;
- }
- printf("文件打开成功n");
- fclose(pf);
- pf = NULL;//避免出现野指针,及时制空
- return 0;
- }
Pode-se observar que como o método de abertura é “w”, um arquivo denominado “test.txt” aparece no caminho.
A seguir, apresentamos diversas funções paraLer ou gravar dados em um arquivo。
Nome da função | Função | Aplicável a |
fgetc | Função de entrada de caracteres | Todos os fluxos de entrada |
fputc | função de saída de caracteres | Todos os fluxos de saída |
Fgets (obtém) | Função de entrada de linha de texto | Todos os fluxos de entrada |
resultados | Função de saída de linha de texto | Todos os fluxos de saída |
fscanf | Função de entrada de formato | Todos os fluxos de entrada |
fimprimirf | Função de saída de formato | Todos os fluxos de saída |
medo | Entrada binária | Fluxo de entrada de arquivo |
escrever | Saída binária | Fluxo 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.
- #include <stdio.h>
-
- int main()
- {
- FILE* pf = fopen("test.txt", "w");//要写入数据,以写的形式打开文件
- if (pf == NULL)
- {
- perror("fopen");
- return 0;
- }
- fprintf(pf, "123456");//向文件中写入数据
- fclose(pf);
- pf = NULL;
- return 0;
- }
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:
- #include <stdio.h>
-
- int main()
- {
- char str[20] = { 0 };
- FILE* pf = fopen("test.txt", "r");//要读取数据,以读的形式打开文件
- if (pf == NULL)
- {
- perror("fopen");
- return 0;
- }
- fscanf(pf, "%s", str);//读取数据到str当中
- printf(str);
- fclose(pf);
- pf = NULL;
- return 0;
- }
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.
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);
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);
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:
- #include <stdio.h>
-
- int main()
- {
- int c = 0;
- FILE* fp = fopen("test.txt", "r");
- if (fp == NULL)
- {
- perror("fopen");
- return 0;
- }
- while ((c = fgetc(fp)) != EOF)//返回EOF则读取结束
- {
- putchar(c);
- }
- //判断读取结束的原因
- if (ferror(fp))
- puts("I/O错误n");
- else if (feof(fp))
- puts("文件读取结束n");
- fclose(fp);
- fp = NULL;
- return 0;
- }
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❤❤❤