fwrite in C在输出文件中给出不同的值

fwrite in C在输出文件中给出不同的值

问题描述:

为什么当我在另一个函数中使用fwrite时,输出文件会有所不同?VERSUS fwrite在同一个函数中?fwrite in C在输出文件中给出不同的值

output1.txt包含像E,这是不正确

output2.txt含 “B”,这是正确

#include <stdio.h> 
#include <string.h> 

void writeData(char *buf, char *path) { 
    FILE *fp1; 
    fp1 = fopen(path, "a"); 
    fwrite(&buf, sizeof(char), strlen(buf), fp1); 
} 

int main() { 


    char buf[2] = "a"; 
    char buf2[3] = "yb"; 
    char file1_path[12] = "output1.txt"; 
    char file2_path[12] = "output2.txt"; 
    memset(buf, 0, sizeof(buf)); 
    memcpy(buf, &buf2[1], strlen(buf2)); 
    printf("%s\n", buf); 

    writeData(buf, file1_path); 

    FILE *fp2; 
    fp2 = fopen(file2_path, "a"); 
    fwrite(&buf, sizeof(char), strlen(buf), fp2); 

    return(0); 
} 
+4

内部'写数据()'表达'&buf'指向一个指针,而不是缓冲液。 –

+0

在'main'中,'&buf'也是错误的,编译器应该警告错误的类型!因为使用数组,*地址*'buf'和'buf'是相同的(但不是类型) –

+0

并且关闭文件,它可能会给你意想不到的输出。 –

writeData功能,在您的来电fwrite

fwrite(&buf, sizeof(char), strlen(buf), fp1); 

变量buf是指向写字符串中的第一个字符。它是char *。然而,表达式&buf是指向变量buf的指针,其类型为char **。这不是同一个数据。


它的工作原理,如果buf阵列因为无论然后buf(这是真的&buf[0])和&buf指向同一位置。尽管如此,它们仍然不同。

例如与

char buf[2]; 

然后buf衰减的指针数组的第一元件(即&buf[0]),并且是char *类型。表达式&buf是指向阵列的指针,并且是char (*)[2]类型。

有点图形

 
+--------+--------+ 
| buf[0] | buf[1] | 
+--------+--------+ 
^ 
| 
&buf[0] 
| 
&buf 

两个指针到同一位置,但不同类型和不同的语义。

在功能写数据改变垃圾值

fwrite(&buf, sizeof(char), strlen(buf), fp1); 

fwrite(buf, sizeof(char), strlen(buf), fp1); 

写数据()应调用的fwrite(BUF,...)不使用fwrite(& BUF,...)