0
votes

C LANG Texte du texte SUME DE FILE DE FICHION DES ROUGES EN ROUGES

// OK, merci de l'aide. J'ai édité le code, passa un pointeur et il imprime maintenant le numéro de la ligne particulière, imprime le numéro de cette ligne et imprime la somme des numéros de consistance. Bonjour jusqu'à présent, mais ... Ce que je veux faire ensuite, est d'attribuer chacune des sommes à un tableau afin que je puisse utiliser une boucle pour vérifier si la somme résultante est égale à toutes les sommes résultantes précédentes. J'utilise l'onglet [N] == Résultat; Malheureusement, après la boucle tandis que la boucle est terminée, tous les éléments de tableau sont vides ... Merci //

Inclure H1>

Inclure H1>
int main()
{
    int result =0;

    read_ints("numbers.txt", &result);


}



void read_ints (const char* file_name, int *result)
{

  FILE* file = fopen ("numbers.txt", "r");
  int i = 0;
  int n=1; //row number//
  int tab[n]; //array

  if (file == NULL)
  {
   printf("unable to open file %s", file_name);

  }
  fscanf (file, "%d", &i);
  while (!feof (file))
    {
      printf ("%d ", i);
      *result += i;
      tab[n]==result;
      printf("row number: %d \n", n);
      n++;

      printf("\n sum of this number and all numbers before is: %d\n", *result);

      fscanf (file, "%d", &i);

    }
          printf("\nnumber from row number one is ... : %d\n", tab[1]);
  fclose (file);



}

c

17 commentaires

La fonction prend 2 arguments mais vous passez 0.


Avez-vous vu des avertissements du compilateur?


Aucun avertissement de compilateur


Puis jetez-le. Votre fonction n'a pas de prototype avant appelé. Et s'appelle avec le mauvais numéro d'arguments. Si le compilateur n'en avertit pas, c'est des ordures, ou vous avez explicitement désactivé les avertissements.


Notez que vous devez souvent activer des avertissements lorsque vous compilez. Par exemple avec GDB, vous compilez avec le drapeau -wall compilateur pour obtenir la plupart des messages d'avertissement activés.


@bruceg avec GCC Je suppose ...


@Eugenesh. haha ... oups. Trop tard pour éditer.


Le code posté ne compile pas. Lors de la compilation, activez les avertissements, puis fixez ces avertissements. (Pour GCC , à une utilisation minimale: -wall -wextra -petic -wall -wextra -petic -wall -wonversion -std = gnu11 ) Remarque: D'autres compilateurs utilisent différentes options pour effectuer la même fonctionnalité.


@bruceg, -wall n'est pas comment obtenir le plus d'informations de gdb Utilisez plutôt l'option: -ggdb3 dans la compilation et le lien pas. Et si vous vouliez dire gcc , l'option: -wall n'est que le début de ce qui est nécessaire, voir mon commentaire précédent


N'utilisez jamais tandis que (! Feof (fichier)) Il ne fait pas ce que vous attendez. Suggérer: tandis que (FSCANF (fichier, "% d", & i); == 1) et supprimez l'appel sur FSCANF () à partir de la fin de la boucle


En ce qui concerne: résultat = résultat + i; une variable locale définie dans une fonction différente est invisible dans une fonction différente. C'EST À DIRE. La variable locale "sort de la portée"


Pour faciliter la lisibilité et la compréhension: veuillez systématiquement indenter le code. Indent après chaque brace d'ouverture "{". Offrent avant chaque forfait de fermeture "}". Suggérer chaque niveau d'indent soit 4 espaces


En ce qui concerne: #include c'est une mauvaise pratique de programmation t Inclure les fichiers d'en-tête Ces contenus ne sont pas utilisés.


J'ai apporté des améliorations, mais maintenant un autre problème


En ce qui concerne; int n = 1; // numéro de rangée // int onglet [n]; // array et `onglet [n] == résultat; .... N ++; `La déclaration de onglet [] ne déclare qu'une seule entrée dans ce tableau. Dès que vous essayez d'attribuer une valeur de valeur onglet [0] Le code écrit en mémoire après la fin de la table. Ceci est un comportement indéfini et peut entraîner un événement de faute SEG. BTW: En C, un index dans une matrice est compris dans la plage 0 ... (nombre d'éléments dans le tableau -1)


concernant: printf ("\ nnumber de la ligne numéro un est ...:% d \ n", onglet [1]); depuis la variable onglet [] Un seul élément et le premier élément d'une matrice est index 0, cette instruction d'impression tente de lire la mémoire après la fin de la table.


S'il vous plaît ne modifiez pas le code posté. Ajoutez plutôt un modifier Afficiliant le code révisé sous forme de bloc distinct


3 Réponses :


1
votes

Votre code est principalement correct. Vous appelez juste lecture_int. Vous devez passer dans un pointeur pour résulter si vous souhaitez une valeur renvoyée. XXX


3 commentaires

C'est en fait la plupart du temps faux. Il n'y a pas de vérification des erreurs lorsque l'ouverture du fichier, le tandis que (! Feof (! fichier)) est faux aussi -


@Eugenesh. Pour son assignation de classe filetée unique, cela ira peut-être. Mais, définitivement, la vérification du fichier pour NULL est toujours une bonne idée. Je vais mettre à jour ma réponse.


La seule chose qui vous sauve ici est que fscanf est à la fin de tandis que (! Feof (fichier)) est toujours faux? boucle de sorte que la valeur de i n'est pas utilisée entre le FSCANF appel et le FEOF chèque. C'est faux, mais par hasard heureuse, aucun comportement indéfini indéfini est invoqué.



0
votes

Le code proposé suivant:

  1. vérifie correctement les erreurs
  2. passe correctement le texte d'erreur sur stardr , y compris la raison textuelle que le système pense que l'erreur est survenue.
  3. utilise la valeur renvoyée de FSCANF () pour contrôler la boucle
  4. correctement contient un "prototype" pour la sous-fonction
  5. utilise correctement vide à l'intérieur des parens de principal () et le prototype de la sous-fonction qui ne reçoit aucun paramètre.
  6. redevient systématiquement le code, pour la lisibilité
  7. compile parfaitement
  8. Documents Pourquoi chaque fichier d'en-tête est inclus

    et maintenant, le code proposé: xxx


3 commentaires

Ce code actuellement ne fonctionne pas correctement lors de la compilation. Peut-être que cela fonctionne pour de petites entrées, mais pour un fichier texte avec 1000 rangées, il ne compte que 5 entiers Consiquent


La seule raison pour laquelle il ne fonctionnerait pas est si le fichier contient autre que les entiers et l'espace blanc. C'EST À DIRE. Si cela ne fonctionne pas pour vous, le fichier d'entrée contient autre chose, comme une virgule ou un point-virgule, etc.


Votre fichier d'entrée contient-il des caractères «larges»? Si tel est le cas, le code posté original tente de travailler avec le mauvais type de caractères. Veuillez poster les premières lignes du fichier d'entrée. (Une autre raison de poster un exemple de reproductible minimal )



0
votes

// OK, le code a une meilleure apparence maintenant, mais toujours, les valeurs de résultat ne semblent pas stocker dans l'onglet []. Cela est dû au manque de pointeur ou de mauvaise déclaration du tableau (?).
Je l'ai intenté comme une matrice dynamique, de sorte que je n'ai pas besoin de déclarer la taille spécifique de la matrice ./// xxx


1 commentaires

Salut les gars, que pensez-vous de cette situation?