|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 8
|
[C] comparazione file di testo
Help me please!!
Devo scrivere un prgramma C che accetta come parametri di ingresso due file di testo e restituisce in uscita la copia delle righe del secondo file che differiscono dalle corrispondenti righe del primo indicando per ciascuna di esse il numero di riga ... almeno datemi qualche suggerimento... |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
abbia capito. Non penso che tu sia entrata/o a scuola e ti abbiano dato un esercizio da fare senza spiegarti prima come risolverlo Almeno fai vedere che sei capace di iniziarlo il programma ... sai come si apre un file ? sai come si legge una riga del file aperto ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2005
Messaggi: 340
|
Quote:
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
ali7.p, non ti sto prendendo in giro, se vuoi imparare a programmare devi imparare ad usare la tua testa, fare tanti errori e soparttutto capire. Se ricevi la pappa pronta non ci riuscirai mai
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: May 2005
Messaggi: 340
|
Quote:
saggio e non cercare su google il codice prefatto, facci vedere cosa sai fare e poi ti aiutiamo |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: $HOME
Messaggi: 1213
|
Quote:
__________________
Last.fm: My Profile / GamerTag XBL: Martcus / Flickr / deviantArt iBook 12'' / MacBook Pro 13'' / iPhone 3G 16GB Black / iPod 5G 30GB / iPod Nano 2G 4GB |
|
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 8
|
voi avete ragione... ma ci sonoa nche altri ocntorni...
cmq... Prendo da argc i due parametri Li apro con fopen Scorro le righe del file e le copio in due stringhe con fgets per il confronto tiengo memoria delle righe con un contatore alla fine di ogni ciclo visualizzo la stringa se diversa) e il contatore la teoria la so... la pratica no... |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
Quote:
prova a scrivere qualche riga di codice, e poi posta se hai problemi
__________________
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: $HOME
Messaggi: 1213
|
Quote:
__________________
Last.fm: My Profile / GamerTag XBL: Martcus / Flickr / deviantArt iBook 12'' / MacBook Pro 13'' / iPhone 3G 16GB Black / iPod 5G 30GB / iPod Nano 2G 4GB |
|
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 8
|
#include <stdio.h>
#include<string.h> int main (int argc, char *argv[]) { if (argc != 3) { printf("Parametri non validi - La sintassi corretta e'\n\n" "%s file_1 file_2\n", argv[0]); exit(1); } FILE *fp; fp=fopen("argv[1]","r"); if(fp==NULL) { printf("ERRORE nell'accesso ai dati"); exit(1); } FILE *fp1; fp1=fopen("argv[2]","r"); if(fp1==NULL) { printf("ERRORE nell'accesso ai dati"); exit(0); } char s1[] = fgetc(&fp); char s2[] = fgetc(&fp1); strcmp(s1, s2); [...] } |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
con la fgetc ottieni un carattere, prova con la fgets
__________________
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
controlla anche il modo in cui hai definito le stringhe.
sarebbe meglio definire prima due array di caratteri dando anche una dimensione e poi riempirli... così dichiari solo un puntatore, non una stringa. tra l'altro in ansi c tutte le variabili vanno dichiarate prima di iniziare ad eseguire le operazioni
__________________
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
Codice:
char s1[] = fgetc(&fp); char s2[] = fgetc(&fp1); Codice:
char s1[MAX_SIZE]; char s2[MAX_SIZE]; ... fgets(s1, MAX_SIZE, fp); fgets(s2, MAX_SIZE, fp1); |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
col termine 'righe' dovrebbe intendere stringhe di caratteri separate da invio. allora una possibilità è quella di leggere prima tutti e due i file, piazzarli in due array diversi - devi allocare la memoria per avere lo spazio, quindi o dichiari direttamente due array con tanto di dimensione, o usi due puntatori e fai una calloc basandoti sulla dimensione dei file e lasciando lo spazio per '\0'; poi apri un ciclo - o while, con un unsigned int che viene inizializzato a 1 prima e incrementato per ogni riga, o for - che termina quando sei arrivato alla fine di almeno uno dei due array. Prima inizializzi anche due var unsigned int che sono quelle che tengono traccia del carattere che sei arrivato a leggere nei due array principali.All'interno apri un altro ciclo che legge carattere per carattere dall'array memorizzato, finchè non trovi un carattere invio - il codice ascii te lo dice gentilmente qualcun altro perchè al momento non ricordo se è l'11 o qualcos'altro - e memorizzi la riga letta in un altro array con dimensioni che vuoi e che bastino a contenere una riga - al massimo lo fai grande quanto quelli principali -. stessa cosa per l'altro array principale. poi fai il confronto tra queste due righe con una strcmp - siamo sempre dentro il ciclo principale. se la strcmp dice che sono diverse stampi la seconda e l'int che stai incrementando per ogni ciclo; ricordati che se sei partito da 1 stamperai lo stesso valore se invece sei partito da zero stamperai quel valore +1. quindi incrementi questa variabile e il ciclo ricomincia.
morale Codice:
char array1[MAX_DIM];
char array2[MAX_DIM];
char aux1[MAX_DIM];
char aux2[MAX_DIM];
[lettura file]
unsigned int contatoreRighe=1;
unsigned int pos1=0;
unsigned int pos2=0;
unsigned int i;
while ((array[pos1])&&(array2[pos2]))
{
for (i=0;((array1[pos1]!=.../* ascii di invio */)&&(array1[pos1]));pos1++,i++)
aux1[i]=array1[pos1];
aux1[i]='\0'; // chiude la stringa copiata carattere per carattere
for (i=0;((array2[pos2]!=.../*ascii di invio */)&&(array2[pos2]));pos2++,i++)
aux2[i]=array2[pos2];
aux2[i]='0';
if (strcmp(aux1,aux2)!=0)
printf("\nRiga numero %u: %s\n", contatoreRighe,aux2);
contatoreRighe++;
if (array1[pos1]) // incrementa indice array solo se non è alla fine
pos1++;
if (array2[pos2])
pos2++;
}
Ultima modifica di Black imp : 11-07-2006 alle 03:43. |
|
|
|
|
|
#15 | |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 8
|
Quote:
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
Codice:
#define MAX_DIM 80 |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:40.



















