用C语言提问fread和fwrite
下面是我将一些硬编码的int值(1,2,3,4,5)写入文件、关闭该文件、以读取模式打开同一文件并读取写入的元素的代码。 从输出中可以看出,fwrite正确执行,但fread读取不正确用C语言提问fread和fwrite,c,file,file-io,fwrite,fread,C,File,File Io,Fwrite,Fread,下面是我将一些硬编码的int值(1,2,3,4,5)写入文件、关闭该文件、以读取模式打开同一文件并读取写入的元素的代码。 从输出中可以看出,fwrite正确执行,但fread读取不正确 #include<stdio.h> int main() { FILE *fptr; FILE *optr; const char *filepath = "E:\\testinput.txt"; int buf[5]={1,2,3,4,5};
#include<stdio.h>
int main()
{
FILE *fptr;
FILE *optr;
const char *filepath = "E:\\testinput.txt";
int buf[5]={1,2,3,4,5};
int obuf[5];
int value;
int *ptr = &value;
int num_bytes_read;
int no_of_iterations;
int i;
int ret;//return value for fwrite
int count = 0;
no_of_iterations = 5;
//open the file
fptr = fopen(filepath, "wb");
if(fptr == NULL){
printf("error in opening input file");
}
/*optr = fopen(outFilepath, "wb");
if(optr == NULL){
printf("error in opening output file");
}*/
printf("int %d ", sizeof(int));
for(i=0;i<5;i++){
printf("writing %d",buf[i]);
ret = fwrite(buf,sizeof(int),1,fptr);
if(ret != 1)
{
printf("error in fwrite:%d\n", ret);
}
}
//written to input file
fclose(fptr);
fptr = fopen(filepath, "rb");
if(fptr == NULL){
printf("error in opening input file");
}
for(i=0;i<5;i++){
//reading from input file
num_bytes_read = fread(ptr,sizeof(int),1,fptr);
if(num_bytes_read == 1){
obuf[i] = *ptr;//storing into buf what is read from file
printf("read successful: %d\n", obuf[i]);
count++;
}
else{
count = 99;
break;
}
printf("\ncount%d", count);
}
fclose(fptr);
return 0;
}
问题出在这一行:
ret = fwrite(buf,sizeof(int),1,fptr);
对fwrite
的所有5个调用都具有相同的缓冲区地址,因此每次写入数组的第一个元素时,即1
由于要逐个写入所有数组元素,请将buf+i
作为起始地址传递给fwrite
:
ret = fwrite(buf+i,sizeof(int),1,fptr);
现在,
fwrite
获取的缓冲区的起始地址是数组的i
th元素的地址。在下面的代码段中,您总是使用buf,因此您总是编写buf[0]
for(i=0;i<5;i++){
printf("writing %d",buf[i]);
ret = fwrite(buf,sizeof(int),1,fptr);
if(ret != 1)
{
printf("error in fwrite:%d\n", ret);
}
}
然后你可以相应地修改你的读取循环,缩进使它很难读取。对不起,我赶时间。我下次发帖时会记住这一点。非常感谢。每次它试图写入整个数组,是吗?@Namratha:不是。每次它都在写入数组的第一个元素。明白了。非常感谢你。它正在工作。如果我想直接从程序外部查看文件内容,我该怎么做?可能吗?@Namratha:尝试使用文件的八进制转储:
od-bc filename
for(i=0;i<5;i++){
printf("writing %d",buf[i]);
ret = fwrite(buf,sizeof(int),1,fptr);
if(ret != 1)
{
printf("error in fwrite:%d\n", ret);
}
}
//write loop
ptr = buf;
for(i=0;i<5;i++){
printf("writing %d",ptr[0]);
ret = fwrite(ptr,sizeof(int),1,fptr);
if(ret != 1)
{
printf("error in fwrite:%d\n", ret);
}
ptr++;
}