函数strcpy上的消息“程序已停止工作”

时间:2017-11-11 04:45:37

标签: c++ file pointers struct strcpy

我是指针上的新手,我已经练习了从txt文件中获取信息的位置,然后将该信息放入结构中。无论如何,当我收到信息并调用de copyname()函数时,编译器似乎停止工作。我还检查了alumno [i] .nombreEst的实例是否已创建,并且它也崩溃了,因为编译器在打印它时什么都不做。如果你们中的任何人都知道我会成为什么样的原因

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


using namespace std;


typedef struct{
    char *nombreEst;
    int nota;
}estudiantes;

estudiantes *alumno;

void copiarNombre(char info[], int i);


int main(int argc, char** argv) {

int n; //numero de registros que desea mostrar
char temp[50];    // cantidad maxima de caracteres por renglon
char info[50];    //variable que almacenara la informacion del archivo
int renglones;  //cuenta la cantidad de renglones en el archivo

FILE *f;                        
f=fopen("registros.txt","r");

if (f==NULL){
    cout << "no se ha podido abrir el archivo o no existe en la carpeta" << endl;
    exit(1);
}


while (!feof(f))  {  //Lee el contenido que se encuentra en el archivo. si retorna un valor distinto a 0 (por ejemplo cuando se acaba el archivo) se sale del while
    fgets(temp, 50, f);
    renglones++;
}

rewind(f); //retorna el lector del compilador que estaba en el ultimo renglon al primero

alumno = (estudiantes*)malloc(renglones*sizeof(estudiantes));  //crea el espacio de memoria de acuerdo a la cantidad de renglones(estudiantes)  por el tamaño de 1 estudiante)
if (alumno == NULL){
    cout << "no se ha podido reservar el espacio de memoria" << endl;
    exit(1);
}


cout << "ingrese el numero de registros que desea mostrar"<< endl; 
cin >> n;

while(n>=renglones || n<=0){
    cout << "No Existen tantos registros. ingrese el numero de registros que desea mostrar"<< endl; 
    cin >> n;
}

for (int i=0; i<=n; i++){
    char aux='0';
    for (int j=0; aux !='-'; j++){
        aux = fgetc(f);
        if (aux != '-'){
            info[j] = aux;
        }
    }
    copiarNombre(info, i);

    fgets (info, 4, f);
    alumno[i].nota = atoi(info);

    cout<< "Nombre: " << alumno[i].nombreEst << " Nota: " << alumno[i].nota << endl;
}



return 0;

}

void copiarNombre(char info[], int i){
int numCaracteres =  strlen(info) + 1;
alumno[i].nombreEst = (char*)malloc(numCaracteres*sizeof(char));
if (alumno[i].nombreEst = NULL){
    cout << "No se ha podido reservar memoria" << endl;
    exit(1);
}
strcpy(alumno[i].nombreEst, info);

0 个答案:

没有答案