PROBLEMA Problema percorso apertura file

Pubblicità

Lazzaro21

Nuovo Utente
Messaggi
1
Reazioni
0
Punteggio
2
Salve,
stavo provando ad eseguire un progetto in C che utilizza l'apertura di vari file,ho provato a farmi aiutare anche dall'AI e a quanto pare il problema riguarda l'apertura di un file, precisamente:

C:\Users\User\Desktop>programma run_test_ordina_array test_suite.txt results.txt
Apro il file di test suite: p\test_suite.txt
Apro il file di risultati: C:\Users\User\Desktop\test_suite.txt
Errore in apertura dei file: No such file or directory

Sembra che non riesca ad aprirmi il primo file, lascio di seguito anche il programma in c:
run test ordina array:
C:
#include <stdio.h>
#include <stdlib.h>
#include "vettore.h"

#define M 20

int run_test_case(char *tc_id, int n) {
    char input_fname[M], output_fname[M], oracle_fname[M];

    // Costruiamo i nomi dei file
    sprintf(input_fname, "%s_input.txt", tc_id);
    sprintf(output_fname, "%s_output.txt", tc_id);
    sprintf(oracle_fname, "%s_oracle.txt", tc_id);

    // Controllo dell'esistenza del file di input
    FILE *input_file = fopen(input_fname, "r");
    if (input_file == NULL) {
        printf("Errore: file di input %s non trovato.\n", input_fname);
        return 0; // o un altro valore che indica errore
    }
    fclose(input_file); // Chiudiamo il file dopo il controllo

    // Controllo dell'esistenza del file oracle
    FILE *oracle_file = fopen(oracle_fname, "r");
    if (oracle_file == NULL) {
        printf("Errore: file oracle %s non trovato.\n", oracle_fname);
        return 0; // o un altro valore che indica errore
    }
    fclose(oracle_file); // Chiudiamo il file dopo il controllo

    // Allochiamo memoria per array di input
    int *input = (int*)malloc(sizeof(int) * n);
    if (!input) {
        printf("Errore allocazione memoria array.");
        exit(1);
    }

    // Carica file di input
    finput_array(input_fname, input, n);
    // Ordina array
    ordina_array(input, n);
    // Scrive file di output
    foutput_array(output_fname, input, n);

    // Allochiamo memoria per array oracolo
    int *oracolo = (int*)malloc(sizeof(int) * n);
    if (!oracolo) {
        printf("Errore allocazione memoria oracolo.");
        exit(1);
    }
    // Carichiamo oracolo
    finput_array(oracle_fname, oracolo, n);
    // Confrontiamo array
    int result = confronta_array(oracolo, input, n);

    // Liberiamo la memoria allocata
    free(input);
    free(oracolo);

    return result;
}

int main(int argc, char *argv[]) {
    if (argc < 3) {
        printf("Nomi dei file mancanti \n");
        exit(1);
    }
 
    printf("Nome del file di test suite: %s\n", argv[1]);
    printf("Nome del file di risultati: %s\n", argv[2]);

    FILE *test_suite, *result;
    char tc_id[M]; // Stringa contenente l'identificativo del test case
    int n, pass;

    // Apro file contenente test suite            
    test_suite = fopen(argv[1], "r");
    // Apro file contenente risultati test          
    result = fopen(argv[2], "w");

    if (test_suite == NULL || result == NULL) {
        perror("Errore in apertura dei file");
        exit(1);
    }
 
    // Scansione del file di input nel ciclo while.
    // Ad ogni iterazione si leggono i due elementi di una riga:
    // l'identificativo del test case tc_id e il numero n di elementi da ordinare
    while (fscanf(test_suite, "%s%d", tc_id, &n) == 2) {
        pass = run_test_case(tc_id, n);

        fprintf(result, "%s ", tc_id);
        if (pass == 1)
            fprintf(result, "PASS \n");
        else
            fprintf(result, "FAIL \n");        
    }

    fclose(test_suite);  // Chiusura file di input
    fclose(result);      // Chiusura file di output

    return 0;
}

vettore.c:
C:
// FILE:   vettore.c
// restituisce 1 se i due vettori di ingresso sono uguali, 0 altrimenti

#include "vettore.h"
#include <stdio.h>
#include <stdlib.h>
#include "utile.h"

int confronta_array(int a[], int b[], int n)
{
    int v=1;
    for(int i=0;i<n;i++){
        if(a[i]!=b[i]) {
        v=0;
        break;
        }
    }
    return v;
}

void foutput_array(char *file_name, int a[], int n)
{
    int i;
    FILE *fd;  

    //aprire il file in scrittura
    fd=fopen(file_name, "w");
    //controllare che il file sia stato aperto correttamente
    //e scrivere il contenuto (fprintf()) di a in fd
    if (fd==NULL) {
        printf("Errore apertura file in vettore.c\n");
        return;
    }
 
    for(i=0;i<n;i++){
        fprintf(fd,"%d\n",a[i]);
    }
 
    // chiudere il file
    fclose(fd);
}

void finput_array(char *file_name, int a[], int n)
{
    int i;
    FILE *fd;

    //apertura file in lettura
    fd=fopen(file_name, "r");
 
    //Controllare se il file esiste e
    //leggere il contenuto (fscanf()) da scrivere in array a
    if (fd==NULL) {
        printf("Errore apertura file in vettore.c \n");
        return;
    }
 
    for(i=0;i<n;i++){
        fscanf(fd,"%d",&a[i]);
    }
    //chiudere il file
    fclose(fd);
}

void ordina_array(int a[], int n)
{
    // Implementazione algoritmo di ordinamento bubble sort
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n - i - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                scambia(&a[j], &a[j + 1]);  // Passiamo i puntatori per scambiare gli elementi
            }
        }
    }
}

utile.c:
C:
// Implementazione del Modulo: file utile.c

void scambia(int *x, int *y)
{
    int temp=*y;
    *y=*x;
    *x=temp;
}
 

Allegati

Ultima modifica:
Sembra che non riesca ad aprirmi il primo file
Quale è il path del file?
Fatti stampare o vai in debug e leggi che path usa e verifica che esista veramente.
E' molto probabile che input_fname non abbia il valore corretto, così a occhio contiene "test_suite.txt_input.txt" e quindi non esiste.
 
if (test_suite == NULL || result == NULL) {
perror("Errore in apertura dei file"); exit(1);
}

Usa 2 check distinti, così sai quale dei due non ti trova.

E come dice Mursey, il path del file, qual è?
Ricordati che deve essere assoluto se il file non è nella cartella dell'eseguibile (visto che uno lo apri in lettura, dovrebbe anche esistere).
 
Pubblicità
Pubblicità
Indietro
Top