C语言中的一个分段错误
我正在创建一个C程序,将列表实现到一个二进制文件中,编译后我收到了一个分段错误。 这是我的代码:C语言中的一个分段错误,c,segmentation-fault,C,Segmentation Fault,我正在创建一个C程序,将列表实现到一个二进制文件中,编译后我收到了一个分段错误。 这是我的代码: #include <stdio.h> #include <string.h> #include <stdlib.h> #define LONG_NP 30 struct Personne { char nomPre[LONG_NP+1]; char sexe ; float taille, poids ; }; str
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LONG_NP 30
struct Personne {
char nomPre[LONG_NP+1];
char sexe ;
float taille, poids ;
};
struct Elem {
struct Personne pers ;
struct Elem * suivant ;
};
typedef struct Elem * pointeur ;
typedef struct Elem Element;
void lire(FILE * aLire, struct Personne * P) {
struct Personne unePers ;
fgets(unePers.nomPre, LONG_NP+1, aLire) ;
fscanf(aLire,"%c%f%f\n", &unePers.sexe, &unePers.taille,
&unePers.poids);
*P = unePers;
}
void creerFIFO(pointeur * P) {
pointeur laListe = NULL, tempo, presentement;
FILE * aLire = fopen("metrique.tp3", "r");
while (! feof(aLire)) {
tempo = (pointeur) malloc ( sizeof (struct Elem));
lire(aLire, &tempo->pers);
if (laListe == NULL)
laListe = tempo ;
else
presentement->suivant = tempo;
presentement = tempo;
}
fclose(aLire);
if (laListe) presentement->suivant = NULL;
*P = laListe;
}
void afficher(pointeur liste, char ordre[]) {
printf("Contenu de la liste en ordre %s\n", ordre);
while (liste) {
printf("%s %c % 7.2f %8.1f\n", liste->pers.nomPre,
liste->pers.sexe, liste->pers.taille, liste->pers.poids);
liste = liste->suivant;
}
}
void creerBinaire( pointeur liste, char * nomFile) {
FILE * aCreer = fopen(nomFile, "wb");
int nbOctets = sizeof(struct Personne);
if(!aCreer)
printf("Fichier pas ouvert\n");
while (liste) {
fwrite(&liste->pers, nbOctets, 1, aCreer);
liste = liste->suivant;
}
fclose(aCreer);
printf("Fin de la creation du fichier binaire\n");
}
void relire(char nomFile[]) {
FILE * aLire = fopen(nomFile, "rb");
struct Personne unePers ;
int rang = 0, nbOctets = sizeof(struct Personne);
while ( fread(&unePers, nbOctets, 1, aLire), !feof(aLire))
printf("%2d) %s %c % 7.2f %8.1f\n", ++rang,
unePers.nomPre, unePers.sexe, unePers.taille,
unePers.poids);
fclose(aLire);
}
/* écrivez vos fonctions ici avec, en commentaires, le numéro de la
question de l'examen à laquelle elles répondent.
*/
/* Question 6 */
void chercherNom(pointeur Liste, pointeur *Av, pointeur *CL, char Nom[])
{
pointeur Avant = NULL;
int trouve = 0;
while (Liste && !trouve)
{
if(strcmp(Nom, Liste->pers.nomPre)!=0)
{
Avant = Liste;
Liste = Liste->suivant;
}
else
trouve = 1;
}
*Av = Avant;
*CL = Liste;
}
void Changer(struct Personne * A, struct Personne B)
{
struct Personne Tempo = *A;
if(strcmp(Tempo.nomPre, B.nomPre) !=0)
strcpy(Tempo.nomPre, B.nomPre);
if(B.sexe != ' ')
Tempo.sexe = B.sexe;
if(B.taille > 0 )
Tempo.taille = B.taille;
if(B.poids >0)
Tempo.poids = B.poids;
*A = Tempo;
}
void cherModif(pointeur Liste, char Nom[], struct Personne Pers)
{
pointeur Avant, CL;
struct Personne Tempo;
chercherNom(Liste,&Avant, &CL,Nom);
if(CL)
{
Tempo = CL->pers;
printf("trouve %s\n",Tempo.nomPre);
Changer(&Tempo,Pers);
CL->pers = Tempo;
}
else
printf("pas trouve %s\n",Nom);
}
void CreerLIFO(pointeur Liste, pointeur *P, char sexevoulu)
{
pointeur L = NULL;
pointeur Tempo;
while(Liste)
{
if(Liste->pers.sexe == sexevoulu)
{
Tempo = (Element *) malloc( sizeof(Element));
Tempo->pers = Liste->pers;
Tempo->suivant = L;
L = Tempo;
}
Liste = Liste->suivant;
}
*P = L;
}
void main() {
/* Écrivez les déclarations des 2 nouvelles listes ici */
pointeur ListeF, ListeM ;
pointeur liste ;
/* question 6 */
struct Personne Tempo;
char NomTempo[LONG_NP+1];
creerFIFO(&liste);
afficher(liste, "FIFO");
/* Écrivez les appels de la fonctions de la
question 6 ici, le bon résultat sera observé
avec la relecture de metrique.bin
*/
strcpy(Tempo.nomPre,"BEDARD MARC-ANDRE ");
Tempo.sexe = 'M';
Tempo.taille = 1.54;
Tempo.poids = 0;
cherModif(liste,Tempo.nomPre,Tempo);
strcpy(NomTempo,"TREMBLAY CYLVAIN ");
strcpy(Tempo.nomPre,"TREMBLAY SYLVAIN ");
Tempo.sexe = ' ' ;
Tempo.taille = 0;
Tempo.poids = 0;
cherModif(liste,NomTempo,Tempo);
creerBinaire(liste, "metrique.bin");
relire("metrique.bin");
/* Écrivez les appels pour la question 7 ici */
CreerLIFO(liste,&ListeF,'F');
CreerLIFO(liste,&ListeM,'M');
/* Pour tester, écrivez 2 appels de la fonction
afficher : */
afficher(ListeF,"LIFO");
afficher(ListeM,"LIFO");
}
这意味着while函数有问题,我怀疑您的文件*
aLire
是nullptr
在将fopen
的返回值用于feof
之前,应先检查其返回值。当我试图运行你的代码时,我看到了一个与你类似的错误,因为我的系统上没有“metrique.tp3”文件。
是否确实有一个(并且与尝试运行的可执行文件位于同一路径)
我无意冒犯你,但从你的代码来看,我认为你没有做过很多编码。至少不是在C/C++中。一些可能对您有帮助的提示:
我稍微修改了函数
lire()
,
现在它工作正常了
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LONG_NP 30
struct Personne {
char nomPre[LONG_NP+1];
char sexe ;
float taille, poids ;
};
struct Elem {
struct Personne pers ;
struct Elem * suivant ;
};
typedef struct Elem * pointeur ;
typedef struct Elem Element;
/*___________________________________________________________________
*/
void lire(FILE * aLire, struct Personne * p) {
if(!p) {
printf("lire: Persone *p est nulle");
return;
}
fgets(p->nomPre, LONG_NP+1, aLire) ;
fscanf(aLire,"%c%f%f\n",
&(p->sexe), &(p->taille),&(p->poids));
}
/*___________________________________________________________________
*/
void creerFIFO(pointeur * P) {
pointeur laListe = NULL, tempo, presentement;
FILE * aLire = fopen("metrique.tp3", "r");
if(aLire) {
while (! feof(aLire)) {
tempo = (pointeur) malloc ( sizeof (struct Elem));
lire(aLire, &tempo->pers);
if (laListe == NULL)
laListe = tempo ;
else
presentement->suivant = tempo;
presentement = tempo;
}
fclose(aLire);
} else {
perror("creerFIFO");
}
if (laListe) presentement->suivant = NULL;
*P = laListe;
}
/*___________________________________________________________________
*/
void afficher(pointeur liste, char ordre[]) {
printf("Contenu de la liste en ordre %s\n", ordre);
while (liste) {
printf("%s %c % 7.2f %8.1f\n", liste->pers.nomPre,
liste->pers.sexe, liste->pers.taille, liste->pers.poids);
liste = liste->suivant;
}
}
/*___________________________________________________________________
*/
void creerBinaire( pointeur liste, char * nomFile) {
FILE * aCreer = fopen(nomFile, "wb");
int nbOctets = sizeof(struct Personne);
if(!aCreer)
printf("Fichier pas ouvert\n");
while (liste) {
fwrite(&(liste->pers), nbOctets , 1, aCreer);
liste = liste->suivant;
}
fclose(aCreer);
printf("Fin de la creation du fichier binaire\n");
}
/*___________________________________________________________________
*/
void relire(char nomFile[]) {
FILE * aLire = fopen(nomFile, "rb");
struct Personne unePers ;
int rang = 0, nbOctets = sizeof(struct Personne);
while ( fread(&unePers, nbOctets, 1, aLire), !feof(aLire))
printf("%2d) %s %c % 7.2f %8.1f\n", ++rang,
unePers.nomPre, unePers.sexe, unePers.taille,
unePers.poids);
fclose(aLire);
}
/*___________________________________________________________________
écrivez vos fonctions ici avec, en commentaires, le numéro de la
question de l'examen à laquelle elles répondent.
Question 6
*/
void chercherNom(pointeur Liste, pointeur *Av, pointeur *CL, char Nom[]) {
pointeur Avant = NULL;
int trouve = 0;
while (Liste && !trouve) {
if(strcmp(Nom, Liste->pers.nomPre)!=0) {
Avant = Liste;
Liste = Liste->suivant;
} else
trouve = 1;
}
*Av = Avant;
*CL = Liste;
}
/*___________________________________________________________________
*/
void Changer(struct Personne * A, struct Personne B) {
struct Personne Tempo = *A;
if(strcmp(Tempo.nomPre, B.nomPre) !=0)
strcpy(Tempo.nomPre, B.nomPre);
if(B.sexe != ' ')
Tempo.sexe = B.sexe;
if(B.taille > 0 )
Tempo.taille = B.taille;
if(B.poids >0)
Tempo.poids = B.poids;
*A = Tempo;
}
/*___________________________________________________________________
*/
void cherModif(pointeur Liste, char Nom[], struct Personne Pers) {
pointeur Avant, CL;
struct Personne Tempo;
chercherNom(Liste,&Avant, &CL,Nom);
if(CL) {
Tempo = CL->pers;
printf("trouve %s\n",Tempo.nomPre);
Changer(&Tempo,Pers);
CL->pers = Tempo;
} else
printf("pas trouve %s\n",Nom);
}
/*___________________________________________________________________
*/
void CreerLIFO(pointeur Liste, pointeur *P, char sexevoulu) {
pointeur L = NULL;
pointeur Tempo;
while(Liste) {
if(Liste->pers.sexe == sexevoulu) {
Tempo = (Element *) malloc( sizeof(Element));
Tempo->pers = Liste->pers;
Tempo->suivant = L;
L = Tempo;
}
Liste = Liste->suivant;
}
*P = L;
}
/*___________________________________________________________________
*/
void main() {
/* Écrivez les déclarations des 2 nouvelles listes ici */
pointeur ListeF, ListeM ;
pointeur liste ;
/* question 6 */
struct Personne Tempo;
char NomTempo[LONG_NP+1];
creerFIFO(&liste);
afficher(liste, "FIFO");
/* Écrivez les appels de la fonctions de la
question 6 ici, le bon résultat sera observé
avec la relecture de metrique.bin
*/
strcpy(Tempo.nomPre,"BEDARD MARC-ANDRE ");
Tempo.sexe = 'M';
Tempo.taille = 1.54;
Tempo.poids = 0;
cherModif(liste,Tempo.nomPre,Tempo);
strcpy(NomTempo, "TREMBLAY CYLVAIN ");
strcpy(Tempo.nomPre,"TREMBLAY SYLVAIN ");
Tempo.sexe = ' ' ;
Tempo.taille = 0;
Tempo.poids = 0;
cherModif(liste,NomTempo,Tempo);
creerBinaire(liste, "metrique.bin");
relire("metrique.bin");
/* Écrivez les appels pour la question 7 ici */
CreerLIFO(liste,&ListeF,'F');
CreerLIFO(liste,&ListeM,'M');
/* Pour tester, écrivez 2 appels de la fonction
afficher : */
afficher(ListeF,"LIFO");
afficher(ListeM,"LIFO");
}
#包括
#包括
#包括
#定义LONG_NP 30
结构人员{
char nomPre[LONG_NP+1];
炭色;
浮动尾翼,点;
};
结构元素{
结构人员;
结构元素*suivant;
};
typedef结构元素*pointeur;
类型定义结构元素;
/*___________________________________________________________________
*/
无效lire(文件*aLire,结构人员*p){
如果(!p){
printf(“lire:Persone*p est nulle”);
回来
}
fgets(p->nomPre,LONG_NP+1,aLire);
fscanf(aLire,“%c%f%f\n”,
&(p->sexe),&(p->taille),&(p->poid);
}
/*___________________________________________________________________
*/
void creerFIFO(pointeur*P){
指针laListe=NULL、节奏、呈现;
文件*aLire=fopen(“metrique.tp3”,“r”);
如果(aLire){
而(!feof(aLire)){
tempo=(指针)malloc(sizeof(struct Elem));
里尔(阿里尔、节奏->佩尔);
if(laListe==NULL)
laListe=节奏;
其他的
演示->suivant=节奏;
呈现=节奏;
}
fclose(aLire);
}否则{
perror(“creerFIFO”);
}
if(laListe)presentation->suivant=NULL;
*P=laListe;
}
/*___________________________________________________________________
*/
无效粘贴器(指针列表,字符顺序[]){
printf(“按顺序排列的内容%s\n”,顺序);
while(liste){
printf(“%s%c%7.2f%8.1f\n”),列表->pers.nomPre,
liste->pers.sexe,liste->pers.taille,liste->pers.poid);
liste=liste->suivant;
}
}
/*___________________________________________________________________
*/
void creerBinaire(指针列表,字符*nomFile){
文件*aCreer=fopen(nomFile,“wb”);
int nbOctets=sizeof(结构人员);
如果(!aCreer)
printf(“Fichier pas ouvert\n”);
while(liste){
fwrite(&(liste->pers),nbOctets,1,aCreer);
liste=liste->suivant;
}
fclose(aCreer);
printf(“fichier binaire公司的创新财务”);
}
/*___________________________________________________________________
*/
void relire(字符文件[]){
文件*aLire=fopen(nomFile,“rb”);
结构人员;
int rang=0,nbOctets=sizeof(结构人员);
while(fread(&unePers,nbOctets,1,aLire),!feof(aLire))
printf(“%2d)%s%c%7.2f%8.1f\n“,++范围,
unePers.nomPre,unePers.sexe,unePers.taille,
联合国系统;
fclose(aLire);
}
/*___________________________________________________________________
埃克里维兹基金会,评论,le numéro de la
莱克斯梅尔·雷波登特的问题。
问题6
*/
void cherchenom(指针列表、指针*Av、指针*CL、字符名称[]){
pointeur Avant=NULL;
int-trove=0;
while(Liste&!trove){
如果(strcmp(Nom,Liste->pers.nomPre)!=0){
先锋=李斯特;
Liste=Liste->suivant;
}否则
trouve=1;
}
*Av=先锋;
*CL=李斯特;
}
/*___________________________________________________________________
*/
无效更改器(结构人员*A、结构人员B){
结构人员节奏=*A;
if(strcmp(Tempo.nomPre,B.nomPre)!=0)
strcpy(Tempo.nomPre,B.nomPre);
如果(B.sexe!='')
节奏性=节奏性;
如果(B.taille>0)
Tempo.taille=B.taille;
如果(B.poid>0)
Tempo.poids=B.poids;
*A=节奏;
}
/*_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LONG_NP 30
struct Personne {
char nomPre[LONG_NP+1];
char sexe ;
float taille, poids ;
};
struct Elem {
struct Personne pers ;
struct Elem * suivant ;
};
typedef struct Elem * pointeur ;
typedef struct Elem Element;
/*___________________________________________________________________
*/
void lire(FILE * aLire, struct Personne * p) {
if(!p) {
printf("lire: Persone *p est nulle");
return;
}
fgets(p->nomPre, LONG_NP+1, aLire) ;
fscanf(aLire,"%c%f%f\n",
&(p->sexe), &(p->taille),&(p->poids));
}
/*___________________________________________________________________
*/
void creerFIFO(pointeur * P) {
pointeur laListe = NULL, tempo, presentement;
FILE * aLire = fopen("metrique.tp3", "r");
if(aLire) {
while (! feof(aLire)) {
tempo = (pointeur) malloc ( sizeof (struct Elem));
lire(aLire, &tempo->pers);
if (laListe == NULL)
laListe = tempo ;
else
presentement->suivant = tempo;
presentement = tempo;
}
fclose(aLire);
} else {
perror("creerFIFO");
}
if (laListe) presentement->suivant = NULL;
*P = laListe;
}
/*___________________________________________________________________
*/
void afficher(pointeur liste, char ordre[]) {
printf("Contenu de la liste en ordre %s\n", ordre);
while (liste) {
printf("%s %c % 7.2f %8.1f\n", liste->pers.nomPre,
liste->pers.sexe, liste->pers.taille, liste->pers.poids);
liste = liste->suivant;
}
}
/*___________________________________________________________________
*/
void creerBinaire( pointeur liste, char * nomFile) {
FILE * aCreer = fopen(nomFile, "wb");
int nbOctets = sizeof(struct Personne);
if(!aCreer)
printf("Fichier pas ouvert\n");
while (liste) {
fwrite(&(liste->pers), nbOctets , 1, aCreer);
liste = liste->suivant;
}
fclose(aCreer);
printf("Fin de la creation du fichier binaire\n");
}
/*___________________________________________________________________
*/
void relire(char nomFile[]) {
FILE * aLire = fopen(nomFile, "rb");
struct Personne unePers ;
int rang = 0, nbOctets = sizeof(struct Personne);
while ( fread(&unePers, nbOctets, 1, aLire), !feof(aLire))
printf("%2d) %s %c % 7.2f %8.1f\n", ++rang,
unePers.nomPre, unePers.sexe, unePers.taille,
unePers.poids);
fclose(aLire);
}
/*___________________________________________________________________
écrivez vos fonctions ici avec, en commentaires, le numéro de la
question de l'examen à laquelle elles répondent.
Question 6
*/
void chercherNom(pointeur Liste, pointeur *Av, pointeur *CL, char Nom[]) {
pointeur Avant = NULL;
int trouve = 0;
while (Liste && !trouve) {
if(strcmp(Nom, Liste->pers.nomPre)!=0) {
Avant = Liste;
Liste = Liste->suivant;
} else
trouve = 1;
}
*Av = Avant;
*CL = Liste;
}
/*___________________________________________________________________
*/
void Changer(struct Personne * A, struct Personne B) {
struct Personne Tempo = *A;
if(strcmp(Tempo.nomPre, B.nomPre) !=0)
strcpy(Tempo.nomPre, B.nomPre);
if(B.sexe != ' ')
Tempo.sexe = B.sexe;
if(B.taille > 0 )
Tempo.taille = B.taille;
if(B.poids >0)
Tempo.poids = B.poids;
*A = Tempo;
}
/*___________________________________________________________________
*/
void cherModif(pointeur Liste, char Nom[], struct Personne Pers) {
pointeur Avant, CL;
struct Personne Tempo;
chercherNom(Liste,&Avant, &CL,Nom);
if(CL) {
Tempo = CL->pers;
printf("trouve %s\n",Tempo.nomPre);
Changer(&Tempo,Pers);
CL->pers = Tempo;
} else
printf("pas trouve %s\n",Nom);
}
/*___________________________________________________________________
*/
void CreerLIFO(pointeur Liste, pointeur *P, char sexevoulu) {
pointeur L = NULL;
pointeur Tempo;
while(Liste) {
if(Liste->pers.sexe == sexevoulu) {
Tempo = (Element *) malloc( sizeof(Element));
Tempo->pers = Liste->pers;
Tempo->suivant = L;
L = Tempo;
}
Liste = Liste->suivant;
}
*P = L;
}
/*___________________________________________________________________
*/
void main() {
/* Écrivez les déclarations des 2 nouvelles listes ici */
pointeur ListeF, ListeM ;
pointeur liste ;
/* question 6 */
struct Personne Tempo;
char NomTempo[LONG_NP+1];
creerFIFO(&liste);
afficher(liste, "FIFO");
/* Écrivez les appels de la fonctions de la
question 6 ici, le bon résultat sera observé
avec la relecture de metrique.bin
*/
strcpy(Tempo.nomPre,"BEDARD MARC-ANDRE ");
Tempo.sexe = 'M';
Tempo.taille = 1.54;
Tempo.poids = 0;
cherModif(liste,Tempo.nomPre,Tempo);
strcpy(NomTempo, "TREMBLAY CYLVAIN ");
strcpy(Tempo.nomPre,"TREMBLAY SYLVAIN ");
Tempo.sexe = ' ' ;
Tempo.taille = 0;
Tempo.poids = 0;
cherModif(liste,NomTempo,Tempo);
creerBinaire(liste, "metrique.bin");
relire("metrique.bin");
/* Écrivez les appels pour la question 7 ici */
CreerLIFO(liste,&ListeF,'F');
CreerLIFO(liste,&ListeM,'M');
/* Pour tester, écrivez 2 appels de la fonction
afficher : */
afficher(ListeF,"LIFO");
afficher(ListeM,"LIFO");
}