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.
|