我正在研究读取文本文件的功能。函数应该找出文本文件有多少记录,malloc
结构数组。它必须是结构数组,因为它在我的赋值中指定。 LineCounter
保存数组应该有多大的值。它的值17是正确的但是当我malloc
数组时它只有4
结构的大小。我在C编程,我也包括<stdlib.h>
,但编译器仍然强迫我投射malloc。
// SEPARATE HEADER FILE
#pragma once
#define FILECITATEL "citatel.txt" // textovy subor obsahujuci zoznam citatelov
typedef struct Citatel {
int id; // id cislo citatela
char meno[20]; // meno citatela
char priezvisko[30]; // priezvisko citatela
};
Citatel *getReaders();
void printReaders(Citatel *listOfReaders);
// END OF HEADER FILE
Citatel *getReaders() {
FILE *fileRead;
fileRead = fopen(FILECITATEL, "r");
if (fileRead == NULL) {
printf("File cannot be opened!...");
return NULL;
}
char readCharacter;
int lineCounter = 0;
while ((readCharacter = fgetc(fileRead)) != EOF) {
if (readCharacter == '\n') lineCounter++;
}
if (readCharacter == EOF) lineCounter++;
rewind(fileRead);
Citatel *list = (Citatel *)malloc(lineCounter * sizeof(Citatel));
for (int i = 0; i < lineCounter; i++) {
fscanf(fileRead, "%d %s %s", &list[i].id, &list[i].meno, &list[i].priezvisko);
}
printf("%d\n", sizeof list);
fclose(fileRead);
return list;
}
答案 0 :(得分:2)
你理解错了:
[Index("name", 1, IsUnique = true)]
返回指针的大小而不是您分配的内存大小。
答案 1 :(得分:2)
变量list
是一个指针,当你得到list
的大小时,你得到指针的大小,而不是它指向的大小。您需要跟踪自己分配的内存。
通常的链接:Don't cast the return of malloc
in C(或任何其他返回void *
的函数)。
如果您使用C ++编程,那么您应该使用std::vector
代替(或最坏情况下使用new[]
)和the standard library streams。
答案 2 :(得分:2)
你的错误在于sizeof list
所在的行,因为它打印了列表指针的大小,即4个字节。您想要打印lineCounter
。
此外,建议您避免转换malloc
的结果。看这里:
Do I cast the result of malloc?