Salvataggio dati file C in una directory specificata

Pubblicità

Noshirt

Nuovo Utente
Messaggi
128
Reazioni
9
Punteggio
38
Buongiorno a tutti ragazzi,

sto preparando un progetto in linguaggio C per l'università, nel quale ho implementato il salvataggio e il caricamento dei dati del programma.

Il codice che ho usato per il salvataggio dei dati è il suddetto:
C:
f = fopen("opa.dat", "w");
        if (f != NULL)
            fprintf(f, "%d", posti_tot);

        fclose(f);

Mentre per il caricamento:
C:
f = fopen("opa.dat", "r");
        if (f != NULL)
            fscanf(f, "%d", &posti_tot);

        fclose(f);

Utilizzo questo metodo per creare più file .dat poiché devo memorizzare diverse variabili, soltanto che vorrei salvarli tutti in una determinata directory e non nella cartella dove si trova il file .exe, per una questione di ordine e pulizia.
RIngrazio anticipatamente per l'aiuto, buona giornata :ok:
 
Semplicemente come argomento const char* _FileName scrivi la directory e il nome del file, così
C:
int main(void)
{
    FILE* file;
    fopen_s(&file, "D:\\File\\A.txt", "w");
    fprintf(file, "Ciao");
    fclose(file);
}
Nota che per rappresentare il carattere '\' bisogna scriverlo due volte.
 
Semplicemente come argomento const char* _FileName scrivi la directory e il nome del file, così
C:
int main(void)
{
    FILE* file;
    fopen_s(&file, "D:\\File\\A.txt", "w");
    fprintf(file, "Ciao");
    fclose(file);
}
Nota che per rappresentare il carattere '\' bisogna scriverlo due volte.

Gentilissimo, grazie mille :luxhello:
E se volessi far partire l'esecuzione del programma automaticamente a schermo intero, c'è un metodo per farlo da codice?
 
Il codice è testato e verrà eseguito solo su macchine Windows?

Sisi... già risolto comunque, ho usato questa cosa qui:

C:
#include <windows.h>
 
#define CONSOLE_FULLSCREEN_MODE 1
typedef BOOL (WINAPI *SetConsoleDisplayModeProc) (HANDLE, DWORD, PCOORD);
 
int main()
{
  COORD coord;
  HMODULE dll = LoadLibrary("kernel32.dll");
  SetConsoleDisplayModeProc SetConsoleDisplayMode = (SetConsoleDisplayModeProc)GetProcAddress(dll, "SetConsoleDisplayMode");
  HANDLE hConsole = GetStdHandle( STD_OUTPUT_HANDLE );
  SetConsoleDisplayMode( hConsole, CONSOLE_FULLSCREEN_MODE, &coord);
 
  //codice             
 
}
 
Sisi... già risolto comunque, ho usato questa cosa qui:

C:
#include <windows.h>

#define CONSOLE_FULLSCREEN_MODE 1
typedef BOOL (WINAPI *SetConsoleDisplayModeProc) (HANDLE, DWORD, PCOORD);

int main()
{
  COORD coord;
  HMODULE dll = LoadLibrary("kernel32.dll");
  SetConsoleDisplayModeProc SetConsoleDisplayMode = (SetConsoleDisplayModeProc)GetProcAddress(dll, "SetConsoleDisplayMode");
  HANDLE hConsole = GetStdHandle( STD_OUTPUT_HANDLE );
  SetConsoleDisplayMode( hConsole, CONSOLE_FULLSCREEN_MODE, &coord);

  //codice            

}
Buono. Ecco sappi che così sei limitato a macchine Windows quindi non so quanto possa piacere il codice a chi è fissato con la portabilità del C
 
Buono. Ecco sappi che così sei limitato a macchine Windows quindi non so quanto possa piacere il codice a chi è fissato con la portabilità del C

Guarda, considerando che è soltanto un progetto che devo presentare per un esame universitario, credo lasci il tempo che trova... grazie mille in ogni caso :brindiamo:
 
Premetto che non sono pratico di C, comunque ho una domanda al riguardo:
qual'è il punto di queste 3 linee qui?!
C++:
  typedef BOOL (WINAPI *SetConsoleDisplayModeProc) (HANDLE, DWORD, PCOORD);
  HMODULE dll = LoadLibrary("kernel32.dll");
  SetConsoleDisplayModeProc SetConsoleDisplayMode = (SetConsoleDisplayModeProc)GetProcAddress(dll, "SetConsoleDisplayMode");

Per fare una prova ho incluso soltanto windows.h (in c++) e posso chiamare SetConsoleDisplayMode() senza problemi e senza tutta quella boilerplate lì :boh:
Un nuovo progetto in Visual studio include kernel32.dll di base, ma anche se non fosse basterebbe fare
C++:
#pragma comment(lib, "kernel32")
e suppongo sia lo stesso in C?
 
@Marcus Aseth usando pragma in quel modo non compili con GCC, la sintassi è valida solo con VC++.
A parte questo, nel caso da te citato lasci al linker l'inclusione della libreria. Nel suo viene caricata la DLL a runtime (cosa che usando la WINAPI in effetti accade, così come di fare un free quando non serve più).

In realtà come dici non serve il load, in quanto quella DLL è caricata in ogni processo (quindi è sufficiente include il file header Windows).
 
Semplicemente come argomento const char* _FileName scrivi la directory e il nome del file, così
C:
int main(void)
{
    FILE* file;
    fopen_s(&file, "D:\\File\\A.txt", "w");
    fprintf(file, "Ciao");
    fclose(file);
}
Nota che per rappresentare il carattere '\' bisogna scriverlo due volte.

Torno con lo stesso problema... se volessi fare un indirizzamento relativo e non assoluto (quindi non partendo da C:), come a dirgli (crea una cartella nella cartella attuale e salvaci quei file... come posso fare?
 
Torno con lo stesso problema... se volessi fare un indirizzamento relativo e non assoluto (quindi non partendo da C:), come a dirgli (crea una cartella nella cartella attuale e salvaci quei file... come posso fare?
Niente di più semplice
C:
int main(void)
{
    FILE *file;
    fopen_s(&file, "Cartella\\Nomefile.txt", "w");
    fprintf_s(file, "Ciao!");
    fclose(file);

    return 0;
}
 
Ok
quindi così creerà una cartella dove salvare i file?
No. fopen non crea nessuna cartella, se gli passi un path che non esiste ritorna error (file not found).
E' tua responsabilita' creare le cartelle di cui hai bisogno, il metodo piu' semplice e' mkdir() che e' valido sia su Unix che su Windows. Tiene presente che mkdir crea solo una cartella, lo devi chiamare per ogni sottocartella di cui hai bisogno. Per questo motivo esistono librerie avanzate che rendono la vita facile per lavorare sul File System, ma dipendono dal linguaggio, dalla architettura e dal sistema operativo.
 
No. fopen non crea nessuna cartella, se gli passi un path che non esiste ritorna error (file not found).
E' tua responsabilita' creare le cartelle di cui hai bisogno, il metodo piu' semplice e' mkdir() che e' valido sia su Unix che su Windows. Tiene presente che mkdir crea solo una cartella, lo devi chiamare per ogni sottocartella di cui hai bisogno. Per questo motivo esistono librerie avanzate che rendono la vita facile per lavorare sul File System, ma dipendono dal linguaggio, dalla architettura e dal sistema operativo.
Ops si mi sono dimenticato di dire che ho creato manualmente la cartella
 
Pubblicità
Pubblicità
Indietro
Top