la lecture des lignes à l'aide de fscanf
salut j'ai un fichier qui contient les lignes suivantes:
wwa weweweof ewewe wdw:
1 11 ms <1 ms <1 ms 174.78.134.1
2 11 ms <1 ms <1 ms 174.78.134.1
3 5 ms <1 ms <1 ms x58trxd00.abcd.edu.com [143.71.290.42]
4 11 ms <1 ms <1 ms 174.78.134.1
je suis en utilisant
if(linecount == 8)
while( fscanf(fp, "%d %s %s %s %s %s %s",&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8) != EOF ){
printf("%s",ch);
}
else if (linecount == 9){
while( fscanf(fp, "%d %s %s %s %s %s %s %s",&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9) != EOF ){
printf("%s",ch);
}
}
comment puis-je vérifier si la ligne de lignes dans le fichier contient 8 ou 9 éléments, afin que je puisse exécuter le dessus le reste-si des instructions en conséquence?
OriginalL'auteur KAKAK | 2013-08-07
Vous devez vous connecter pour publier un commentaire.
Pas.
Pas.
La lecture des lignes se fait à l'aide de la
fgets()
fonction (lire le manuel drôle):Ensuite, vous pouvez l'analyser en utilisant
sscanf()
(pas de préférence) ou sain d'esprit, comme les fonctionsstrchr()
etstrtok_r()
(de préférence). Il est également important de ne pas(h)notant que la valeur de retour descanf()
(docs) est pasEOF
, mais le nombre d'entités réussi à lire. Donc, un paresseux approche pour l'analyse de la chaîne:Notez également que vous feriez mieux d'utiliser une certaine longueur-limitation de la
%s
indicateur de conversion afin d'éviter le débordement de la mémoire tampon d'erreurs, comme ceci:De même, vous ne devez pas utiliser le
&
adresse de l'opérateur lors de la numérisation (en) une chaîne de caractères - le tableau de char déjà désintègre enchar *
, et c'est exactement ce que le%s
indicateur de conversion s'attend - le type de&s1
estchar (*)[N]
sis1
est un tableau de Nchar
s - et des différences de type rendscanf()
invoquer un comportement indéfini.else if ...<8)
?Vous incluez 8 conversion des prescripteurs au lieu de 9, peut-être?
cependant, mon fichier txt peut contenir soit 9 elemts 8 ou même la moindre des éléments, pour le cas: 9 - je obtenir l'adresse ip sur le 9e élément et de le stocker, pour le cas 8: je obtenir l'adresse ip à 8 élément d'un magasin, en fait ce qui compte c'est que je extarct de l'adresse ip, soit 8 ou 9 de l'élément de pas les autres
Vous n'obtenez pas de moi... d'Abord essayer de conversion de 9 éléments. Si cela échoue, essayez de le convertir 8. etc.
Eh bien, vous écrivez
s9
au lieu de&s9
, peut-être?OriginalL'auteur
Utilisation
fgets
pour obtenir la ligne, puis effectuez l'unesscanf
pour vérifier les 9 éléments, et si cela échoue, alors l'utilisationsscanf
à nouveau afin de vérifier la 8 de l'élément de ligne.Si le format de la ligne est égale à l'exception d'un article supplémentaires, puis rappelez-vous que le
scanf
famille de fonctions renvoient le nombre de succès en documents numérisés. Donc, il pourrait être suffisant de simplement appelersscanf
une fois, et vérifier si elle renvoie8
ou9
.OriginalL'auteur Some programmer dude
Vous devez utiliser le
fgets()
fonction parce que votreswag
valeur dans votre tableau est actuellement fixé ànull
.OriginalL'auteur swagger
et n'utilisez pas
&
avecstring
type (tableaux de char) types de données avecscanf
raison:
Une "chaîne" C est l'adresse d'un tampon de caractères.
Vous souhaitez scanf pour remplir la mémoire dans la mémoire tampon, ce qui est pointé par la variable.
En revanche, un int est un bloc de mémoire, pas une adresse. Afin de scanf pour remplir la mémoire, vous devez passer son adresse.
Tout est fait 🙂
OriginalL'auteur The_dempa