Struct ffblk erreur [Résolu/Fermé]

Signaler
-
 Utilisateur anonyme -
Bonjour.

J'aimerais utiliser ceci en langage C :
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>

int main()
{
    struct ffblk ffblk;
    return 0;
}

Le compilateur me renvoie cette erreur :
error: storage size of 'ffblk' isn't known


Quelqu'un peut m'aider s'il vous plait ?

Merci,

1 réponse

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 756
Bonjour,

Le compilateur t'indique qu'il ne connaît pas la structure ffblk...
L'as-tu définie ?
Utilisateur anonyme
En fait je veux changer le contenu, le remplacer par le contenu d'un fichier de base par exemple base.txt.
Messages postés
5547
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 mai 2021
933
Ah, donc tu as juste besoin :

- de dénombrer le nombre de fichiers contenu dans le répertoire courant (ce que tu peux faire avec les fonctions de dirent.h et MinGW sans te prendre la tête, puisque tu veux juste compter les fichiers et récupérer leurs noms)
- de supprimer les fichiers avec la fonction standard du C remove() accessible par stdio.h : http://www.cplusplus.com/reference/cstdio/remove/
- de créer un fichier texte par fichier supprimé, au contenu identique, avec un nom identique mais ajoutant un numéro séquentiel pour les distinguer, avec les fonctions standard du C fopen(), fputs() (ou autre) et fclose() accessibles par stdio.h aussi, en y mettant le même contenu texte http://www.cplusplus.com/reference/cstdio/

Pas la peine de renommer, ni d'effectuer des acrobaties en tentant de modifier le contenu de fichiers existants.

.. ou alors, j'ai encore raté un truc .. :-/

Dal
Merci ! C'est exactement ça qu'il me faut.
Y a-t-il un moyen de copier directement le contenu du fichier dans un autre, sans connaitre ce contenu en question ?

Voici mon code actuel :
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>

int main()
{
    int nb = 0;
    DIR* repertoire = NULL;
    FILE* new = NULL;
    new = fopen("test.txt", "w+");
    struct dirent* read = NULL;
    repertoire = opendir("C:\\Users\\username\\Projet\\test");
    if (repertoire == NULL)
        perror("");

   while ((read = readdir(repertoire)) != NULL)
   {
     printf("%ld --> %s\n",telldir(repertoire) ,read->d_name);

     if (strcmp(read->d_name, ".") != 0 && strcmp(read->d_name, "..") != 0)
     nb++;

   }
    if (closedir(repertoire) == -1)
    perror("");

   printf("\nNombre de fichiers : %d\n", nb);
   return 0;
}



Voici un résultat de la console :

1 : .
2 : ..
3 : 72144139.jpg
4 : bin
5 : Tools.log.txt
6 : main.c
7 : projets.cbp
8 : projets.depend
9 : projets.layout
10 : test.txt
11 : obj

Nombre de fichiers : 9

Process returned 0 (0x0) execution time : -0.000 s
Press any key to continue.
Messages postés
5547
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 mai 2021
933
En gros : tu ouvres le fichier de référence, tu le lis dans un tampon mémoire, tu le fermes, et tu t'en sert pour écrire les différents fichiers numérotés séquentiellement.

Vu que tu ne "connais" pas le contenu, tu devrais en déterminer la taille avec fseek pour dimensionner une variable allouée dynamiquement.

Tu as une base de travail perfectible dans cette contribution sur SO de Nils Pipenbrinck :

https://stackoverflow.com/questions/174531/how-to-read-the-content-of-a-file-to-a-string-in-c


Dal
Voici mon code, en quelque sorte "final", il arrive au résultat que je cherche, mais je ne sais pas si c'est le meilleur moyen de faire...

/* J'ai un peu changé mon objectif, ce n'est plus un fichier quelconque que je copie, mais l'executable de base. En fait, je copie le contenu de l'executable de base, dans les autres fichiers. Normalement cela devrait marcher, mais je ne peux plus ouvrir les autres executables "copies", on me dit de verifier l'architecture 32/64 bit, je suis sur 64. De plus, je ne choisis plus un répértoire manuellement, les actions se font dans le répértoire de l'éxecutable. Pour arriver à mon objectif, j'ai crée une variable forUse contenant le chemin + le nom de l'éxecutable (pour pouvoir le copier), et par la suite je crée un fichier quelconque .exe avec pour nom celui de l'executable + un nombre, déterminé par la variable relay, avec la boucle while, et ensuite je copie octet par octet le contenu de l'exe dans ce fichier .exe*/

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
//#include <errno.h>, je ne renvoie plus de perror(""), ni de printf() car cela ne me sert à rien que la console affiche quelque chose, pour ce que je veux faire.
#include <windows.h>
#include <winbase.h>

//Les prototypes
int longueur(const char* chaine);
int copy(const char *fSrc, const char *fDest);

int main()
{
    int nb = 0, j = 0, k = 0;
    DIR* repertoire = NULL;
    FILE* zone = NULL; //fichier que je vais crée
    char relay = '0'; //permet d'ajouter un nombre derriere le nom

    char nom[20] = "test..exe"; //nom des fichiers, il y a deux ".." car plus tard je demande à remplacer le (k-4)ème caractère par relay, k étant la taille totale de la chaine, le premier point sera donc remplacé
    k = longueur(nom); //appel de la fonction longueur, pour avoir la longueur de la chaine
    nom[k+1] = '\0'; //Je coupe la chaine au caractère k+1

    char Path[80]; //va contenir le chemin de l'executable, sans le nom, exemple : //C:\Users\projet
    char forUse[80]; //va contenir le chemin + le nom de l'exe, exemple :
//C:\Users\projet\test.exe
    GetModuleFileName(0,Path,80);
    GetModuleFileName(0,forUse,80);
    j = longueur(Path); //on cherche la taille de Path, pour retirer le nom de l'exe
    Path[j-9] = '\0'; //on retire test.exe de la chaine, on coupe avant

    struct dirent* read = NULL;
    repertoire = opendir(Path);

    if (repertoire == NULL)
        exit(0);

   while ((read = readdir(repertoire)) != NULL)
   {
     if (strcmp(read->d_name, ".") != 0 && strcmp(read->d_name, "..") != 0)
     {
     nb++;
     relay++;

     nom[k-4] = relay; //on remplace le premier "." de "test..exe"
     remove(read->d_name); //suppression des fichiers lus

     zone = fopen(nom, "wb"); //on crée un fichier nom, nom peut est donc au debut égal à "test1.exe", 1 étant incrémenté à chaque passage
     copy(forUse, nom); //appel de la fonction copy, pour copier octet par octet l'executable forUse dans le fichier nom crée
     }
   }
   nom[k-4] = relay+1;
   rename(forUse, nom); //je renomme l'executable avec le nom test mais le relay supérieur à tout ceux déjà crées, exemple :

/* Au debut : image.bmp, fichier.txt, class.cpp, test.exe (mon executable)
   A la fin : test1.exe, test2.exe, text3.exe, test4.exe (mon executable est le 4, non le 1) */

    if (closedir(repertoire) == -1)
    exit(-1);

   return 0;
}

int longueur(const char* chaine)
{
    int caracNb = 0;
    char carac = 0;

    do
    {
        carac = chaine[caracNb];
        caracNb++;
    }
    while(carac != '\0');
    caracNb--;

    return caracNb;
}

int copy(const char *fSrc, const char *fDest)
{

    FILE *fSrc_t   = NULL;
    FILE *fDest_t  = NULL;
    int c          = 0;

    fSrc_t = fopen(fSrc, "rb");
    fDest_t = fopen(fDest, "wb");
    c = fgetc(fSrc_t);
        while(c != EOF)
        {
        c = fgetc(fSrc_t);
        fputc(c, fDest_t);
        }

    fclose(fSrc_t);
    fclose(fDest_t);

    return 0;
}