Tôi cần đọc tệp .txt và gán từng từ trong tệp vào một cấu trúc được trỏ từ một vectơ cấu trúc. Tôi sẽ giải thích nó tốt hơn dưới đây.
Cảm ơn sự giúp đỡ của bạn.
Chương trình của tôi chỉ phân bổ từ đầu tiên của tệp...
Tôi biết vấn đề nằm ở hàm Inside_termo() vì tôi đã kiểm tra fscanf whitout khi gọi hàm đó và nó hoạt động tốt.
kết cấu
cấu trúc typedef _item
{
int conta;
char *termo;
} Mục;
cấu trúc typedef _mapa
{
int Total; // số của nó không có bản đồ
int khối; // số khối của nó
Mục **lista; // bác sĩ điều chỉnh thông tin
} Bản đồ;
chủ yếu
int main()
{
Bản đồ mp;
TẬP TIN *arq;
int i, kết quả, numPalavras;
phao x;
int valor, max, min, mincar;
char caminho[20];
char termo[40];
int tam;
inicia_mapa(&mp);
giá trị = menu();
Đây là phần quan trọng trong mã của tôi. Tôi đọc tệp trong đường dẫn do người dùng cung cấp và gọi hàm insere_termo();
, chịu trách nhiệm phân bổ struct
mỗi từ trong .
công tắc (giá trị)
{
trường hợp 1:
printf ("*Ler Arquivo* \n");
printf("Số caminho: ");
scanf("%s", caminho);
arq = fopen(caminho,"r"); // abrir arquivo no caminho especado
nếu (arq == NULL)
{
printf("Lỗi, không có khả năng xảy ra sự cố hoặc arquivo\n");
}
while(fscanf(arq, "%s", termo) != EOF)
{
//Adiciona cada palavra no vetor
insere_termo(&mp, termo);
}
phá vỡ;
chức năng
INICIA_MAPA() là hàm chịu trách nhiệm bắt đầu ánh xạ, phân bổ một khối chứa 10 con trỏ tới "mục" cấu trúc.
INSERE_TERMO() là hàm chịu trách nhiệm gán các từ được cung cấp bởi tệp văn bản. Có một số vấn đề với việc cấp phát bộ nhớ nhưng tôi không thể giải quyết được. Mọi trợ giúp đều được chào đón.
void inicia_mapa (Mapa *mp) //inicia um mapa vazio
{
mp->lista = (Item**)malloc(BLOCK*sizeof(Item*));
mp->tổng = 0;
mp->blocos = 1;
}
void insere_termo (Mapa *mp, char *s) // insere um item com termo se conta = 1
{
if ((mp->total != 0)&&((mp->total%BLOCK) == 0))
{
mp->lista = (Item**)realloc(mp->lista,(mp->blocos+1)*BLOCK*(sizeof(Item*)));
mp->blocos++;
}
mp->lista[mp->total] = (Item*) malloc(sizeof(Item)); // định vị mục trên bản đồ
if (mp->lista[mp->total] == NULL)
{
printf("Lỗi ghi nhớ tập tin\n");
thoát (0);
}
strcpy(mp->lista[mp->total]->termo, s); // Nhập vào termo s
printf("%s\n", mp->lista[mp->total]->termo);
mp->lista[mp->total]->conta++;
mp->total++; //contagem làm tổng
}
strcpy(mp->lista[mp->total]->termo, s);
thất bại như mp->lista[mp->total]->termo
Chưa được phân công. con trỏ sẽ chưa được khởi tạo P
p được chuyển tới strcpy(p, ...)
Đúnghành vi không xác định (UB).
Thay vào đó phân bổ bộ nhớ và sau đó sử dụng strcpy()
Tạo một bản sao
// strcpy(mp->lista[mp->total]->termo, s);
p->lista[mp->total]->termo = malloc(strlen(s) + 1);
strcpy(p->lista[mp->total]->termo, s);
// hoặc
p->lista[mp->total]->termo = strdup(s);
Đảm bảo giải phóng bộ nhớ khi hoàn tất.
Có thể có những vấn đề khác.
Tôi là một lập trình viên xuất sắc, rất giỏi!