// 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 //
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);
}
3 Réponses :
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.
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)) code> 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 code> est à la fin de tandis que (! Feof (fichier)) est toujours faux? b> boucle de sorte que la valeur de i code> n'est pas utilisée entre le FSCANF code> appel et le FEOF code> chèque. C'est faux, mais par hasard heureuse, aucun comportement indéfini indéfini i> est invoqué.
Le code proposé suivant:
stardr code>, y compris la raison textuelle que le système pense que l'erreur est survenue. LI>
- utilise la valeur renvoyée de
FSCANF () code> pour contrôler la boucle li>
- correctement contient un "prototype" pour la sous-fonction li>
- utilise correctement
vide code> à l'intérieur des parens de principal () code> et le prototype de la sous-fonction qui ne reçoit aucun paramètre. LI>
- redevient systématiquement le code, pour la lisibilité li>
- compile parfaitement li>
- Documents Pourquoi chaque fichier d'en-tête est inclus LI>
ol>
et maintenant, le code proposé: p> xxx pré> p>
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 )
// 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 .///
Salut les gars, que pensez-vous de cette situation?
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 code> compilateur pour obtenir la plupart des messages d'avertissement activés.@bruceg avec
GCC code> 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 code>, à une utilisation minimale:-wall -wextra -petic -wall -wextra -petic -wall -wonversion -std = gnu11 code>) Remarque: D'autres compilateurs utilisent différentes options pour effectuer la même fonctionnalité.@bruceg,
-wall code> n'est pas comment obtenir le plus d'informations degdb code> Utilisez plutôt l'option:-ggdb3 code> dans la compilation et le lien pas. Et si vous vouliez diregcc code>, l'option:-wall code> n'est que le début de ce qui est nécessaire, voir mon commentaire précédentN'utilisez jamais
tandis que (! Feof (fichier)) code> Il ne fait pas ce que vous attendez. Suggérer:tandis que (FSCANF (fichier, "% d", & i); == 1) code> et supprimez l'appel surFSCANF () code> à partir de la fin de la boucleEn ce qui concerne:
résultat = résultat + i; code> 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 code> 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 code> et `onglet [n] == résultat; .... N ++; `La déclaration deonglet [] code> ne déclare qu'une seule entrée dans ce tableau. Dès que vous essayez d'attribuer une valeur de valeuronglet [0] code> 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]); code> depuis la variableonglet [] code> 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 code> Afficiliant le code révisé sous forme de bloc distinct