Esercizio c

di il
13 risposte

Esercizio c

Salve, sono uno studente di ingegneria e sono nuovo del forum, se possibile avrei bisogno del vostro aiuto per risolvere il seguente esercizio poiché non funziona, vi ringrazio per la disponibilitá:

https://imagizer.imageshack.us/v2/855x641q90/538/iMcQrq.jpg


#include <stdio.h>
#include <stdlib.h>

void copiamatrice( char nome_f[], char nome_f1[], int t );


int main()
{
char nome_file[100];
char nome_file1[100];
int k;


printf( "inserisci file input \n inserisci file output \n inserisci valore k \n" );
scanf( "%s", nome_file );
scanf( "%s", nome_file1 );
scanf( "%d", &k );

if( k <= 10 ) {
copiamatrice( nome_file, nome_file1, k );
}
else {
return 0;
}
}


void copiamatrice( char nome_f[], char nome_f1[], int t )
{

FILE *fp;
FILE *fp1;

int i = 0;
int x;
int j;
int n = 30;
int riga[n];
int num;
char ch;

fp = fopen( nome_f, "r" );
fp1 = fopen( nome_f1, "w" );

while( ( ch = getc(fp) ) != EOF ) {
do {
fscanf( fp, "%d", &num );
riga = num;
i++;
}
while( (ch = getc(fp)) != '\n' );
for( j = 0; j < t; j++ ) {
for( x = 0; x < i; x++ ) {
fprintf( fp1, "%d ", riga[x] );
}
fprintf( fp1, "\n" );
}
i = 0;
}

fclose( fp );
fclose( fp1 );

}

13 Risposte

  • Re: Esercizio c

    Cosa non funziona ?
  • Re: Esercizio c

    Non copia nulla nel secondo file, e quando eseguo il programma ottengo il seguente messaggio:
    error while dumping state( probably corrupted stack )
    segmentation fault ( core dumped )

    penso ci sia qualche errore nella funzione, anche se a me sembra corretta
  • Re: Esercizio c

    Io provo a farlo in c++ dato che non uso mai il c... comunque spero di esserti utile


    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <string>

    using namespace std;

    int _tmain(int argc, _TCHAR* argv[])
    {
    string nome_file = "";
    string nome_file_destinazione = "";
    int line_mult;

    cin >> nome_file;
    cin >> nome_file_destinazione;
    cin >> line_mult;

    ofstream write;
    ifstream read;
    read.open(nome_file);
    write.open(nome_file_destinazione, ios::out);
    string mult = "";
    while (getline(read, mult))
    {
    for (int y = 0; y < line_mult; y++)
    {
    write << mult << " ";
    }
    write << '\n';
    }

    read.close();
    write.close();
    return 0;
    }
  • Re: Esercizio c

    Non conosco bene il c++.. ma comunque a grandi linee mi sembra di aver capito capito come lavora il programma. In ogni caso ti ringrazio per la disponibilitá
  • Re: Esercizio c

    Perfetto, fammi sapere se hai risolto e magari se ti sono tornato utile... Ma il tuo algoritmo é simile al mio?? Ciao
  • Re: Esercizio c

    Sono riuscito a risolverlo, peró ho ancora alcuni dubbi, dato che ho dovuto riformulare un algoritmo diverso.. nel tuo algoritmo la matrice la consideri come un´unica stringa di caratteri, giusto?
    perché alla fine sono riuscito a farlo, considerando peró la matrice formata da un vettore di "n righe"..
  • Re: Esercizio c

    Ciao,
    se ti interessa ancora puoi guardare questa versione dell'algoritmo, che mi sembra particolarmente semplice:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void copiamatrice( char nome_f[], char nome_f1[], int t );
    
    
    int main() 
    {
    	char nome_file[100];
    	char nome_file1[100];
    	int k;
    
    
    	printf( "inserisci file input \n inserisci file output \n inserisci valore k \n" );
    	scanf( "%s", nome_file );
    	scanf( "%s", nome_file1 );
    	scanf( "%d", &k );
    
    	if( k <= 10 )
    	{
    		copiamatrice( nome_file, nome_file1, k );
    	}
    	else
    	{
    		return -1;
    	}
    	
    	return 0;
    }
    
    
    void copiamatrice( char nome_f[], char nome_f1[], int t )
    {
    
    	FILE *fp;
    	FILE *fp1;
    
    	int i = 0;
    	char riga[100];
    
    	fp = fopen( nome_f, "r" );
    	fp1 = fopen( nome_f1, "w" );
    	
    	while(fgets(riga, 99, fp) != NULL)
    	{
    	    strtok(riga, "\n");
    	    for(i=0; i<t; i++)
    	    {
    	        fprintf(fp1, "%s", riga);
    	    }
    	    fprintf(fp1, "\n");
    	}
    
    	fclose( fp );
    	fclose( fp1 );
    
    }
    
    
  • Re: Esercizio c

    Ciao, certo che mi interessa, anzi, ti ringrazio molto per il tuo aiuto.
    ..un´ultima domanda, secondo te dove ho sbagliato a compilare il programma?
  • Re: Esercizio c

    Secondo me era sbagliato il ciclo di lettura. Ad esempio tu leggi un carattere alla volta, ma come fai se un numero è formato da due o più caratteri? Ad esempio il numero 10 non verrebbe letto correttamente. Poi, se proprio vuoi seguire questa strada, ti conviene memorizzare la matrice in un array bidimensionale, quindi
    
    int matrice[N][N];
    
    in modo da rispettare più da vicino la struttura del file. Si può fare anche con un array monodimensionale ma, a mio parere, è anche più complesso.
  • Re: Esercizio c

    Questa è una possibile versione con l'array bidimensionale:
    
    void copiamatrice( char nome_f[], char nome_f1[], int t )
    {
    
    	FILE *fp;
    	FILE *fp1;
    
    	int matrice[N][N];
    	int i, j, k;
    
    	fp = fopen( nome_f, "r" );
    	fp1 = fopen( nome_f1, "w" );
    	
    	for(i=0; i<N; i++)
    	{
    		for(j=0; j<N; j++)
    		{
    			fscanf(fp, "%d", &(matrice[i][j]));
    		}
    	}
    	
    	for(i=0; i<N; i++)
    	{
    		for(k=0; k<t; k++)
    		{
    			for(j=0; j<N; j++)
    			{
    				fprintf(fp1, "%d ", matrice[i][j]);
    			}
    		}
    		fprintf(fp1, "\n");
    	}
    
    	fclose( fp );
    	fclose( fp1 );
    }
  • Re: Esercizio c

    minomic ha scritto:


    Secondo me era sbagliato il ciclo di lettura. Ad esempio tu leggi un carattere alla volta, ma come fai se un numero è formato da due o più caratteri? Ad esempio il numero 10 non verrebbe letto correttamente. Poi, se proprio vuoi seguire questa strada, ti conviene memorizzare la matrice in un array bidimensionale, quindi
    
    int matrice[N][N];
    
    in modo da rispettare più da vicino la struttura del file. Si può fare anche con un array monodimensionale ma, a mio parere, è anche più complesso.
    In effetti ho scelto la soluzione più complicata per risolvere l´esercizio..
    Hai ragione l´errore è nel ciclo, ma "teoricamente" non dovrebbe avere problemi a leggere numeri a più caratteri, perché ho considerato la matrice come un´unica stringa, peró evidentemente mi sta sfuggendo qualcosa perché alla fine il programma non funziona
  • Re: Esercizio c

    minomic ha scritto:


    Questa è una possibile versione con l'array bidimensionale:
    
    void copiamatrice( char nome_f[], char nome_f1[], int t )
    {
    
    	FILE *fp;
    	FILE *fp1;
    
    	int matrice[N][N];
    	int i, j, k;
    
    	fp = fopen( nome_f, "r" );
    	fp1 = fopen( nome_f1, "w" );
    	
    	for(i=0; i<N; i++)
    	{
    		for(j=0; j<N; j++)
    		{
    			fscanf(fp, "%d", &(matrice[i][j]));
    		}
    	}
    	
    	for(i=0; i<N; i++)
    	{
    		for(k=0; k<t; k++)
    		{
    			for(j=0; j<N; j++)
    			{
    				fprintf(fp1, "%d ", matrice[i][j]);
    			}
    		}
    		fprintf(fp1, "\n");
    	}
    
    	fclose( fp );
    	fclose( fp1 );
    }
    Alla fine ho risolto anche io cosí, comunque la prima soluzione che hai postato mi sembra più flessibile ( nel caso la matrice contenesse anche caratteri )
  • Re: Esercizio c

    nicola47 ha scritto:


    la prima soluzione che hai postato mi sembra più flessibile ( nel caso la matrice contenesse anche caratteri )
    Sì, questo è vero. La prima soluzione è indipendente dal contenuto della matrice: prende le righe e le replica per il numero di volte necessario.
Devi accedere o registrarti per scrivere nel forum
13 risposte