Passage de pointeur de fichier dans les fonctions et les fichiers ne sont pas lues correctement
Je pense que mon problème avec mon code que le fichier n'est pas passé correctement. L'entrée est un fichier avec trois lignes
1 2 3;
4 5 6;
7 8 9;
et la sortie est une erreur de Segmentation (core dumped), la sortie est censé pour imprimer la première ligne 1 2 3.
#include <stdio.h>
#include <stdlib.h>
int getNum();
int getLine();
int getMatrix();
int det1();
int det2();
int det3();
int det4();
int det5();
int det6();
main(){
FILE *infile;
infile = fopen("matrix.txt","r");
int line[6];
int lineSize;
int error;
getLine(line,lineSize,infile);
printf("%d %d\n", line[0],line[1]);
fclose(infile);
}
/***********************************************
Name : getLine
Description : To get the line of numbers
Arguments : infile - the file pointer with numbers inside
line[] - the line of numbers
lineSize - size of line
Returns : 1 - If no errors were encountered
2 - If END OF FILE was reached
-1 if non number detected
*************************************************/
int getLine(int line[], int lineSize, FILE *infile){
int value;
int l;
lineSize=0;
while(value != '\n'){
value=0;
l=getNum(value,*infile);
if (value==EOF){
return(2);
}
line[lineSize]=value;
lineSize++;
}
if (l == -1){
return(-1);
}
return(1);
}
/***********************************************
Name : getNum
Description : To get the Next number from file
Arguments : infile - the file with numbers inside
value - the value of number grabed
Returns : 1 - If no errors were encountered
-1 - If letter or non number detected
*************************************************/
int getNum(int value, FILE *infile){
int c;
int error=1;
while ((c=getc(infile)) != EOF){
if (c=='\n'){
value = '\n';
return(1);
}
if(c==32){//checking for space
if (error == -1){
return(-1);
}
else{
return(1);
}
}
else {
value = 10*value + c - '0';
}
if((c<=47)||(c>=58)){
printf("incorrect number input %d\n",c);
error = -1;
}
}
value = EOF;
return(1);
}
Vous devez vous connecter pour publier un commentaire.
Écrémage votre code ...
Ces déclarations dire au compilateur: "hey compilateur, s'il vous plaît être conscient que je vais être l'appel de fonctions avec ces noms (getNum, getLine, getMatrix, det1, ...) et un retour
int
, mais je ne vous dis pas quels sont les paramètres qu'ils acceptent. Fais-moi confiance quand je les utiliser"C'est mieux si vous utilisez le prototype de droit lorsque vous introduisez les fonctions du compilateur
Ces déclarations dire au compilateur: "hey compilateur, s'il vous plaît être conscient que je vais ba l'appel de la fonction avec ces noms, ils reviennent
int
et accepter ces paramètres. Si je fais une erreur, ne se plaignent à me le faire savoir de ma faute"... continue à l'intérieur de main()
vous avez déclaré
lineSize
, mais n'en est pas de fournir une valeur pour la variable. Lorsque le programme appelle getLine, la valeur de lineSize est presque certainement pas la bonne valeur (il pourrait même faire votre plantage de l'ordinateur avant même l'appel de la fonction). Initialiser (presque) toutes les variables avant de les utiliser.Je n'ai pas écrémé en plus ...
Suggestion: manivelle de votre avertissement du compilateur niveau et de ne pas exécuter votre programme lors de la compilation produit des avertissements.
Dans
getLine()
, lorsque vous donnez l'infile
FILE*
à lagetNum()
fonction, vous déréférencement d'elle:Mais
getNum()
serait juste de s'attendre à une normaleFILE*
, pas un déréférencé un. Donc passerinfile
de la fonction inchangée:En outre, la
while(value != '\n')
boucle sera donc probablement jamais, écrit-delà de la fin de lalines
tableau jusqu'à ce que vous obtenez une erreur de segmentation.value
, qui est en contrôle lorsque la boucle se termine, n'est jamais modifié, elle aussi n'est pas initialisé, le rendant commencer avec une valeur arbitraire). LegetNum()
fonction, qui est probablement censé modifiervalue
, obtient un copie de l'entier passé en paramètre, puis modifie cette copie. L'originalvalue
est jamais modifiée.Si vous voulez que la fonction de changement de la
value
variable, vous devez utiliser un pointeur qui pointe versvalue
et qui est utilisé pour modifier cette variable:Aussi c'est un peu douteux que
value
, une variable de type entier, est affecté et comparée à'\n'
, un caractère littéral. Êtes-vous sûr que vous voulez utiliser la valeur entière de'\n'
comme une cessation de l'état de votre boucle?Pas une réponse directe, je vous recommande de coller un certain nombre de printf consolidés au hasard des spots qui vous permettent d'affiner le point exact de l'accident relativement rapidement. Les déplacer jusqu'à ce que vous avez deux printfs bracketing d'une seule ligne de code que vous savez alors d'être le coupable de s'écraser, ce qui vous permettra de diagnostiquer mieux.