我有一个代码,应该读取一个数组,将其写入二进制文件和文本文件,然后打印文件。但是,fprintf函数返回错误,我不知道为什么。 这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *f,*b;
if (f=fopen("fis.txt","w+")==NULL) {
printf ("Error\n");
exit(1);
}
if(b=fopen("binar.txt","w+b")==NULL) {
printf ("Error\n");
exit(1);
}
float *v; int n;
char s[1000];
scanf("%d",&n);
v=malloc(n*sizeof(float));
int x,y;
for (int i=0;i<=n;i++) {
scanf("%f",&v[i]);
printf("%f",v[i]);
x=fprintf(f,"%f",v[i]);
if (x<0) printf("err\n");
y=fprintf(b,"%f",v[i]);
if (y<0) printf ("err2\n");
}
fgets(s,sizeof(s),f);
puts(s);
printf("\n");
fgets(s,sizeof(s),b);
puts(s);
printf("\n");
free(v);
fclose(f);
fclose(b);
}
答案 0 :(得分:3)
主要问题是如何打开文件:
if (f=fopen("fis.txt","w+")==NULL) {
相等运算符==
的优先级高于赋值运算符=
的优先级。因此,首先将fopen
的结果与NULL比较,然后将该比较的结果(即0或1)分配给f
。因此f
指向的位置无效,这就是您的fprintf
调用失败的原因。如果您在编译器上出现警告,则应该警告您将整数分配给指针。
添加括号以获得正确的顺序:
if ((f=fopen("fis.txt","w+"))==NULL) {
并且:
if ((b=fopen("binar.txt","w+b"))==NULL) {
此外,您的循环条件不正确:
for (int i=0;i<=n;i++) {
数组v
具有n
个元素,这意味着其索引从0
到n-1
,但是从0
到n
循环。更改循环条件以解决此问题:
for (int i=0;i<n;i++) {
您还需要在每个文件描述符上调用rewind
,然后再从文件描述符中读取,以便您可以读取刚刚写的内容:
rewind(f);
fgets(s,sizeof(s),f);
puts(s);
printf("\n");
rewind(b);
fgets(s,sizeof(s),b);
puts(s);
printf("\n");