我正在努力从我在程序生命周期中创建的文件中读取浮点数。我试图回放文件,我试图在读取文件之前打开并关闭文件,我试图将值直接放在表中并通过另一个变量。我能做些什么,这里有什么问题?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL));
float *tab;
float x = 0.0;
int i, size;
FILE *fp;
fp = fopen("data.txt", "w+");
if (fp == NULL) {
printf("Error");
system("PAUSE");
exit(1);
}
printf("Size of table: ");
scanf("%d", &size);
tab = (int*)malloc(size * sizeof(int));
for (i = 0; i < size; i++) {
tab[i] = (8.0 - 2.0) * (float)rand() / RAND_MAX + 2.0;
fprintf(fp, "%.2f ", tab[i]);
}
for (i = 0; i < size; i++) {
printf("%.2f ", tab[i]);
}
printf("\n");
fp = fclose;
fp = fopen("data.txt", "w+");
tab = realloc(tab, 2*size);
for (i = 0; i < size * 2; i+=2) {
fscanf(fp, "%f", &x);
printf("%.2f ", x);
//tab[i + 1] = tab[i] / 2;
}
/*for (i = 0; i < size * 2; i++) {
printf("%.2f \n", tab[i]);
}*/
fp = fclose;
printf("\n");
system("PAUSE");
return 0;
}
答案 0 :(得分:1)
此代码中存在许多问题。首先,如评论中所述,初始分配是错误的。您正在为float
s分配空间,而不是int
s。如果您已经将调用写入malloc()
,则可以完全避免此问题:
tab = malloc(sizeof(*tab) * size);
此处,malloc()
的结果未投出since it is not necessary in C。另请注意,不是使用显式类型作为sizeof
运算符的参数,而是使用标识符。这保证了tab
的任何类型(必须是指针),sizeof
的结果都是正确的。此外,您应该始终检查分配是否成功。
fp = fclose
是错的。这应该是fclose(fp)
。在此之后,当您使用"w+"
再次打开文件时,文件将被截断为零长度,并且您将丢失先前写入的数据。由于该文件已使用"w+"
打开,因此请在此处使用rewind(fp)
。
对于你所做的重新分配,除了参数不完全正确之外,你应该知道一个潜在的问题。 realloc()
可以在分配错误的情况下返回空指针。如果发生这种情况,并且您直接将realloc()
的结果分配给要重新分配的指针(tab
),那么您将丢失对先前分配的内存的引用。这是内存泄漏,数据丢失。执行此操作的方法是将realloc()
的结果存储在您测试的临时指针中。如果临时指针是空指针,则出现错误;否则你可以安全地将返回值分配给原始指针。
如前所述,当您最后一次致电fclose()
时,需要fclose(fp)
。
以下是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL));
float *tab, *temp; // added temp for realloc() check
float x = 0.0;
int i, size;
FILE *fp;
fp = fopen("data.txt", "w+");
if (fp == NULL) {
printf("Error");
system("PAUSE");
exit(1);
}
printf("Size of table: ");
scanf("%d", &size);
/* You should always check for allocation errors */
if ((tab = malloc(sizeof(*tab) * size)) == NULL) {
fprintf(stderr, "Error in initial allocation\n");
exit(EXIT_FAILURE);
}
for (i = 0; i < size; i++) {
tab[i] = (8.0 - 2.0) * (float)rand() / RAND_MAX + 2.0;
fprintf(fp, "%.2f ", tab[i]);
}
for (i = 0; i < size; i++) {
printf("%.2f ", tab[i]);
}
printf("\n");
// fclose(fp); // not fp = fclose;
// fp = fopen("data.txt", "w+"); // when you reopen, the file is truncated
rewind(fp); // but just do this
/* Fixed this reallocation */
temp = realloc(tab, sizeof(*tab) * size * 2);
if (temp == NULL) {
fprintf(stderr, "Error in reallocation\n");
exit(EXIT_FAILURE);
}
tab = temp;
for (i = 0; i < size * 2; i+=2) {
fscanf(fp, "%f", &x);
printf("%.2f ", x);
//tab[i + 1] = tab[i] / 2;
}
/*for (i = 0; i < size * 2; i++) {
printf("%.2f \n", tab[i]);
}*/
fclose(fp); // not fp = fclose;
printf("\n");
system("PAUSE");
return 0;
}
示例互动:
Size of table: 10
2.65 5.67 5.21 3.22 3.07 4.29 5.96 5.96 5.15 7.36
2.65 5.67 5.21 3.22 3.07 4.29 5.96 5.96 5.15 7.36