Sistemas  
 
Rede de conhecimento computador >> Sistemas >> Unix >> Content
Como você escreve um programa C para o comando diff que usamos no Unix?
Você não pode replicar perfeitamente a funcionalidade completa do comando unix `diff` em um programa conciso C. `diff` é uma utilidade sofisticada com muitas opções e algoritmos para lidar com diferentes tipos de arquivos e métodos de comparação (unificado, contexto etc.). No entanto, podemos criar uma versão simplificada que compara dois arquivos de texto linha por linha e relata diferenças.

Este programa se concentra na forma mais simples de comparação linha a linha, relatórios adicionados e excluídos linhas:

`` `c
#include
#include
#include

#Define max_line_length 1024

int main (int argc, char *argv []) {
if (argc! =3) {
fprintf (stderr, "uso:%s file1 file2 \ n", argv [0]);
retornar 1;
}

Arquivo *file1 =fopen (argv [1], "r");
Arquivo *file2 =fopen (argv [2], "r");

if (file1 ==null || file2 ==null) {
perror ("arquivo de abertura de erro");
retornar 1;
}

char line1 [max_line_length], linha2 [max_line_length];
int line_num =1;

while (fgets (linha1, max_line_length, file1)! =null || fgets (line2, max_line_length, file2)! =null) {
// lida com casos em que um arquivo tem mais linhas do que o outro
if (fgets (linha1, max_line_length, file1) ==null) {
printf (" %d <%s", line_num, line2); // linha adicionada no arquivo2
} else if (fgets (line2, max_line_length, file2) ==null) {
printf (" %d> %s", line_num, linha1); // linha adicionada no arquivo1

} else if (strcmp (linha1, linha2)! =0) {
printf (" %d:%s %d:%s", line_num, line1, line_num, line2); // linhas diferem

}
line_num ++;
}

fclose (file1);
fclose (file2);
retornar 0;
}
`` `

Explicação:

1. inclui: Os arquivos de cabeçalho necessários para entrada/saída padrão, funções de biblioteca padrão e manipulação de string.
2. Manuseio de argumento: Verifica se exatamente dois nomes de arquivos são fornecidos como argumentos da linha de comando.
3. Abertura do arquivo: Abre os dois arquivos no modo de leitura ("R"). O manuseio de erros está incluído para verificar as falhas de abertura do arquivo.
4. comparação de linha por linha: O loop `while` lê linhas de ambos os arquivos usando` fgets`. Ele compara linhas usando `strcmp`.
5. Relatórios de diferença: Se as linhas diferentes ou um arquivo tiver mais linhas que as outras, ele imprime uma indicação da diferença, incluindo o número da linha. Este é um relatório de diferença muito básico - um verdadeiro `diff` ofereceria formatos de saída mais sofisticados.
6. Fechamento do arquivo : Fecha os dois arquivos para liberar recursos.


para compilar e executar (em um sistema com um compilador C como o GCC):

1. Salve o código como `mydiff.c`.
2. Compilar:`gcc mydiff.c -o mydiff`
3. Execute:`./mydiff file1.txt file2.txt` (substitua` file1.txt` e `file2.txt` com seus nomes de arquivos)


Limitações:

* Comparação simples de linha por linha: Ele não lida com cenários mais complexos, como linhas movidas ou espaço em branco.
* Nenhuma opção: Falta as numerosas opções do real `diff` (por exemplo,` -u` para diff unificado).
* Manuseio de erro: O manuseio de erros é mínimo. Uma versão robusta lidaria com mais erros em potencial (por exemplo, arquivos muito grandes, falhas de alocação de memória).
* Limite de comprimento da linha: A macro `max_line_length` limita o comprimento das linhas que ele pode manusear.


Para criar um programa mais completo do tipo "Diff", você precisaria implementar algoritmos mais sofisticados (como o algoritmo Diff Myers), lidar com vários formatos de saída de diff e adicionar verificação abrangente de erros e análise de opções. Este é um empreendimento significativo. Este exemplo simplificado fornece uma compreensão básica do conceito central.

Anterior :

Próximo :
  Os artigos relacionados
·O que é a comunicação interprocessante no Unix? 
·Como encontrar um Tutorial Unix 
·Qual é a diferença entre LPAR e VIOS? 
·Quais são os campos usados ​​no arquivo de senha do Un…
·Tutorial de Programação Unix 
·O que Pam representa no Linux? 
·O que significa costela CD? 
·Como você troca de usuário no Unix? 
·O comando sort é um filtro no unix? 
·O que é matar -12 no Unix? 
  Artigos em destaque
·Como Excluir Histórico de Execução no Windows 
·Por que o Windows continua minimizando os programas? 
·Como encontrar uma chave OEM 
·Como converter OGM para AVI no Mac 
·Como Headtrack com uma Webcam 
·Quanto custa um Dell latitude 2100? 
·O software DOS usa uma interface de usuário e menus qu…
·Como consertar a câmera do Mac que não funciona 
·Como redefinir o Windows 10 de fábrica e por que você…
·Informações sobre o sistema operacional Windows XP 
Cop e direita © Rede de conhecimento computador https://ptcomputador.com Todos os Direitos Reservados