我正在努力从我在程序生命周期内创建的文件中读取 float 。我试图倒带文件,我试图在读取文件之前打开和关闭文件,我试图将值直接放入表中并通过另一个变量。我不知道我还能做什么,这里出了什么问题?
#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;
}
最佳答案
这段代码存在很多问题。首先,正如评论中指出的,最初的分配是错误的。您正在为 float
分配空间,而不是为 int
分配空间。如果您像这样编写对 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
关于c - 如何从c中的文件中读取 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42071670/