我们先来看一个简单的程序:
#include<stdio.h>
int main()
{
int a = 0;
int len = sizeof(a);
// 相当于在log1中以文本文件方式输入0
// 文件对应的比特串实际为00110000
FILE *fp1 = fopen("log1", "w");
fprintf(fp1, "%d", a);
fclose(fp1);
// 文件对应的比特串实际为00000000000000000000000000000000
FILE *fp2 = fopen("log2", "wb");
fwrite(&a, len, 1, fp2);
fclose(fp2);
return 0;
}
同样是为了存一个整数0,log1和log2是不一样的,这是正常的。下面,我们来继续看程序:
#include<stdio.h>
int main()
{
char c = 'a';
int len = sizeof(c);
FILE *fp1 = fopen("log1", "w");
fprintf(fp1, "%c", c);
fclose(fp1);
FILE *fp2 = fopen("log2", "wb");
fwrite(&c, len, 1, fp2);
fclose(fp2);
return 0;
}
结果,log1和log2居然是一样的,大家可以思考一下为什么。接着看程序:
#include<stdio.h>
#include<string.h>
int main()
{
char s[] = "hello world";
int len = strlen("hello world");
FILE *fp1 = fopen("log1", "w");
fprintf(fp1, "%s", s);
fclose(fp1);
FILE *fp2 = fopen("log2", "wb");
fwrite(s, len, 1, fp2);
fclose(fp2);
return 0;
}
结果,log1和log2居然也是一样的,原因与上类似。
可见,在针对字符和字符串时候,fwrite写了之后,实际上还是文本文件。
我们再看程序:
#include<stdio.h>
int main()
{
int a = 9;
int len = sizeof(a);
FILE *fp1 = fopen("log1", "wb");
fwrite(&a, len, 1, fp1);
fclose(fp1);
// fwrite最好不要和"w"混用
FILE *fp2 = fopen("log2", "w");
fwrite(&a, len, 1, fp2);
fclose(fp2);
return 0;
}
结果,log1和log2完全一样。继续看下面程序:
#include<stdio.h>
#include<string.h>
int main()
{
char s[] = "hello world";
int len = strlen("hello world");
FILE *fp1 = fopen("log1", "w");
fprintf(fp1, "%s", s);
fclose(fp1);
FILE *fp2 = fopen("log2", "wb");
fwrite(s, len, 1, fp2);
fclose(fp2);
// fwrite最好不要和"w"混用
FILE *fp3 = fopen("log3", "w");
fwrite(s, len, 1, fp3);
fclose(fp3);
return 0;
}
结果, log1, log2, log3三个文件完全一样。
可见,在写文件时,用什么打开,并不重要,关键是用fprintf还是用fwrite.