-1
votes

tandis que la boucle est en lecture seule première ligne du fichier

Bienvenue, j'ai un problème avec ma boucle. Il ne lit que la première ligne de fichier.txt. Avant d'ajouter de la funcition à scinder ma ligne par strtok_r, mes applications ne fonctionnent pas bien. Le but de ce temps de cette boucle est lit toutes les lignes du fichier et scinder la ligne de toussingle par "|" et ces parties ajoutent aux onglets appropriés. Que devrais-je faire? C'est mon code: xxx

films.txt: xxx


20 commentaires

Bienvenue dans le débordement de pile. Veuillez lire Les pages d'aide , prendre The So Tour , lisez à propos de Comment poser de bonnes questions , ainsi que Cette question de contrôle . Enfin, essayez de créer un exemple de reproductible minimal pour nous montrer.


Titre = Films [x] -> Titre; N'as-tu voulu dire Films [x] -> Titre = titre; ? Mais même ce serait faux ...


Veuillez travailler sur cette question de la question fournie par certains.


J'ai essayé de trouver une solution à ce problème, mais je ne pouvais pas :(


Commencez par nous montrer le contenu du fichier d'entrée.


Est-ce que le programme se bloque? (Astuce: ajoutez un imprimeur après la boucle tandis que)


Est x initialisé à zéro? Comment films défini? Vous devez nous montrer plus de code.


Changer Titre de caractère; à Char * Titre; etc.


Et qu'est-ce que int an = atoi (année); signifie ??


Changer de caractère sur int


Il y a une chance que l'année int = masque le char * année; moins déroutant d'utiliser des noms différents.


Char Titre = NULL; -> CHAR * TITLE = NULL; ET Ceci s'applique également aux lignes suivantes.


Ok mais il lit seulement une ligne


Quel est le deuxième bloc de code?


Vous n'avez toujours pas montré le fichier d'entrée ...


Il fonctionne d'ajouter le titre, l'année et le genre à mon fichier TXT


Avez-vous besoin de mon fichier.txt?


Nous avons besoin de films.txt!


@Pablokwiatkowski S'il vous plaît répondez à ces questions. a) Avez-vous essayé de mettre une déclaration d'impression après la boucle de temps et de l'avoir imprimé? b) Faites-vous tomber votre programme? c) Quel est le contenu des films de fichier.txt?


A) oui et il n'a rien imprimé :( b) non, une seule ligne et rien


3 Réponses :


0
votes

Sur tout autre problème possible, ces lignes sont problématiques:

    strcpy(movies[x]->title, title);
    movies[x]->year = year;
    strcpy(movies[x]->genre, genre);
  • Comme il est dit dans la remarque, les affectations doivent être inversées ( films [x] -> foo = foo; code>) li>
  • Vous devez dupliquer les chaînes d'autre que vous enregistrez une sous-adresses de Tekst em> qui est modifiée chaque boucle et peut être disparue lorsque vous les utiliserez LI> ul>

    SO P>

        movies[x]->title = strdup(title);
        movies[x]->year = year;
        movies[x]->genre = strdup(genre);
    


13 commentaires

@Pablokwiatkowski es-tu distincte des films [x] -> Titre et films [x] -> Genre sont car [] plutôt que de char *?


Je dois vérifier ça


ils sont char []


@Pablokwiatkowski ok, alors regardez le Strcpy, je viens de modifier ma réponse


@Pablokwiatkowski et qu'est-ce qui ajoute? un accident ?


Je ne vois pas comment cela répond à la question


@ 4386427 Que voulez-vous dire? Nous n'avons presque aucune infos, le code donné ne peut pas compiler, etc., je parle simplement des problèmes visibles, et comme vous pouvez le voir, Paul a dit les mêmes choses quelques minutes après moi


La question concerne "seulement la lecture d'une ligne du fichier" - je ne vois pas cette réponse en adressant que


@ 4386427 Je ne vois aucune réponse du tout de vous ;-)


Je ne réponds pas parce que je ne sais pas quelle est la réponse ... Je peux voir plusieurs bugs dans le code mais aucun qui explique le comportement op décrit


@ 4386427 Je crains que nous puissions simplement demander de fermer cette question car pas assez de matériau et de matériel donné est faux


@Pablokwiatkowski Que voulez-vous dire par "... et rien ne se passe"?


L'application ne me montre que ceci après cette ligne "processus retourné -1073741819 (0xc0000005) Heure d'exécution: 3.141 S Appuyez sur n'importe quelle touche pour continuer".



1
votes

Je parie que chaque ligne est imprimée avec printf ("% s", Tekst); .

Mais vous oubliez que strutok n'est pas < / EM> Faites une copie de la chaîne. Ainsi (si vous avez vos missions fixées dans l'inverse), vous attribuez toujours des poinétrs dans la même variable Tekst à tous vos films. Au lieu de cela, allouez la mémoire et copiez les chaînes: xxx

et identique pour les autres variables de chaîne.


6 commentaires

Ou simplement utiliser STRUP () si disponible (presque n'importe où)


Oui, comme je l'ai fait dans ma réponse quelques minutes avant ^^


Voir les commentaires à votre question pour plus de bugs.


Mais tekst est lu avec fgets avant chaque nouvelle impression, donc je ne peux pas voir comment cela explique qu'une seule ligne est imprimée dans la boucle


Tournez des avertissements de votre compilateur sur. Il y a quelques problèmes (bugs) qui peuvent contrarier le programme. Par exemple, attribuer un pointeur à un char.


Maintenant, j'ai ce problème "| Erreur: attribution à l'expression avec type de tableau |"



0
votes

Il existe un certain nombre de bugs dans votre programme.

Pour commencer avec ceci: p> xxx pré>

ensemble avec ceci: p> xxx Pré>

Vous définissez titre code> en tant que char code> mais strtok_r code> renvoie un char * code>. Par conséquent, vous écrasez la mémoire en stockant un «pointeur de caractère» dans une variable «Char». Cela pourrait détruire le pointeur de fichier. L'erreur 0xc0000005 que vous obtenez (comme vous le mentionnez dans un commentaire) pourrait indiquer que: P>

Erreur d'application 0xc0000005 (violation d'accès) L'erreur est généralement causée par votre ordinateur de ne pas pouvoir traiter correctement les fichiers ... P> blockQquote>

modifie la définition à: p> xxx pré>

plus loin: p> xxx pré>

changez-le à: P>

struct movie { char title[100]; int year; char genre[100]; }; 

int main() {
    int i = 0; 
    struct movie *movies[50];
    for(i=0; i<50; ++i) movies[i] = malloc(sizeof *movies);
    . . .


1 commentaires

Les commentaires ne sont pas pour une discussion prolongée; Cette conversation a été déplacé pour discuter .