这段代码编译没有问题但是当我运行它时,这会崩溃并且不起作用。 我注意到了,错误发生在这部分
EXTRAE_DATOS(nombre_alumno[i] , alias);
我不知道出了什么问题,请帮助。
#include <stdlib.h>
#include <string.h> //strlen
#include <stdio.h>
#define fila 2 //<<<<<<<<<<<<<<<<<<<<<<<<<< AQUI DESPUES HAY QUE CAMBIAR POR 500000, PUSE 2 PARA PROBAR CON 2 DATOS
#define columna 50
void EXTRAE_DATOS(char *variable, FILE *file);
int main()
{
FILE *alias;
alias = fopen("datos.txt","r");
if (alias == NULL)
{
printf("\nError: El archivo 'datos.txt' no se ha encontrado.\n");
}
char **nombre_alumno;
int Matricula_alumno=1;
nombre_alumno=(char**)malloc(fila*sizeof(char*));
int i;
//recorro el vector dinamico nombre_alumno para hacer vectores en cada uno de sus elementos
for(i=0;i<fila;i++)
{
nombre_alumno[i]=(char*)malloc(columna*sizeof(char));
if(nombre_alumno[i]==NULL)
{
printf("No se ha podido reservar memoria");
exit(1);
}
}
//dandole valores a la primera matriz nombre_alumno
for(i=0;i<fila;i++)
{
EXTRAE_DATOS(nombre_alumno[i] , alias); // <<<<<<<<<<------------ AQUI ESTA EL PROBLEMA
}
for(i=0;i<fila;i++)
{
printf("INSERT INTO ALUMNO VALUES (%d,'%s');\n",Matricula_alumno,nombre_alumno[i]);
Matricula_alumno++;
}
//Function to extract the data from the file
void EXTRAE_DATOS(char *variable, FILE *file)
{
int fin_campo , i;
char auxiliar[50];
char caracter;
i = 0;
fin_campo = 0;
while(fin_campo == 0) //Lee todo un campo caracter por caracter.
{
caracter = fgetc(file);
if((caracter == '\r' || caracter == ','))
{
fin_campo = 1;
}
else
{
auxiliar[i] = caracter;
i++;
}
}
auxiliar[i] = '\0';
strcpy(variable , auxiliar);
}
我在里面创建了一个名为“datos”的txt文件,只是为了证明: 的吉娜,巴特莱
原始txt必须有50000个数据。
答案 0 :(得分:2)
您没有正确检测到该行的结尾:
if((caracter == '\r' || caracter == ','))
{
fin_campo = 1;
}
else
{
auxiliar[i] = caracter;
i++;
}
在Linux计算机上,换行符为\n
,而不是\r
。因此,您继续编写auxiliar
数组的末尾,并调用undefined behavior。
您需要为\n
添加支票:
if((caracter == '\n' || caracter == '\r' || caracter == ','))
此外,您应该将caracter
的类型更改为int
。这样,您可以检查EOF
并在这种情况下突破循环。您还应该检查i
是否超过字符串的长度。
答案 1 :(得分:0)
你的循环是无限的,这意味着你在边界之外写作并调用未定义的行为。
要解决此问题,您必须将caracter
声明为int
。
然后你必须检查caracters
(从文件读取字符后)是否等于EOF
或换行符。
更改
if((caracter == '\r' || caracter == ','))
到
if((caracter == '\n' || caracter == ','))
并添加EOF检查。
if (caracter == EOF) { return EOF; }
// In main exit loop after reaching EOF
if(EXTRAE_DATOS(nombre_alumno[i] , alias) == EOF) break;
打印后也不要忘记释放已分配的内存。
<强> Corrected code. 强>