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

标签 c fwrite c-strings

为什么当我在另一个函数中使用 fwrite 与在同一函数中使用 fwrite 时输出文件不同?

output1.txt 包含像 Ê 这样的垃圾值,这是不正确的

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);
}

最佳答案

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

两个指针指向相同的位置,但类型不同,语义不同。

关于c - C中的fwrite在输出文件中给出不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46997747/

相关文章:

c++ - 返回一个空的 C 字符串

c - 这个 "make a triangle loop"循环超过必要时间的任何原因

c++ - 是否可以使用 ADO 和 C++ 从 SQL 存储过程中获取 CString 返回值(例如名称)的值

java - C/C++ 是否有 Findbugs 和/或 PMD 等价物?

c - c中的 "short int"和 "short"有什么区别?

c++ - fwrite 后如何确定数据在磁盘上?

C - fwrite() 不输出到文件

c++ - 如何使用 PEM_Write_RSA_PrivateKey 将 RSA 私钥加密并写入文件

c - 如何在C中初始化结构数组的成员

c - 为什么写入现有文件比写入不存在的文件慢?