C中的fwrite在输出文件中给出不同的值
fwrite in C giving different values in output files
为什么我在另一个函数中使用 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 change
fwrite(&buf, sizeof(char), strlen(buf), fp1);
到
fwrite(buf, sizeof(char), strlen(buf), fp1);
在 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
指向同一位置的两个指针,但类型不同,语义不同。
writeData() 应该调用 fwrite(buf, ...) 而不是 fwrite(&buf, ...)
为什么我在另一个函数中使用 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 change
fwrite(&buf, sizeof(char), strlen(buf), fp1);
到
fwrite(buf, sizeof(char), strlen(buf), fp1);
在 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
指向同一位置的两个指针,但类型不同,语义不同。
writeData() 应该调用 fwrite(buf, ...) 而不是 fwrite(&buf, ...)