C++ fprintf是否写入'\0';如果我写了一个字符串,你会把它写到文件中吗?
为了理解文件操作,我编写了以下代码C++ fprintf是否写入'\0';如果我写了一个字符串,你会把它写到文件中吗?,c++,C++,为了理解文件操作,我编写了以下代码 #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { FILE *fp = fopen("c:\\te_st.txt", "w+"); fprintf(fp, "aa"); char *buf = new char[4]; fseek(fp, 0, SEEK_SE
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
FILE *fp = fopen("c:\\te_st.txt", "w+");
fprintf(fp, "aa");
char *buf = new char[4];
fseek(fp, 0, SEEK_SET);
int bytes = fscanf(fp, "%s", buf);
cout << bytes << " " << buf << endl;
fclose(fp);
delete buf;
return 0;
}
“aa”和一些垃圾字符正在显示。有人能告诉我有什么区别吗 调用fopen时,必须指定是以文本还是二进制打开文件:
FILE *fp = fopen("c:\\te_st.txt", "w+t"); // open text
FILE *fp = fopen("c:\\te_st.txt", "w+b"); // open binary
fprintf
()和fscanf
()函数用于文本文件。
fwrite
()和fread
()函数用于二进制文件。
使用fread
()读取时,您有责任将终止的0插入缓冲区fread
()返回从文件中读取的元素数,因此如果使用参数size=1调用它,并且返回的值为正值,则该值可以用作在缓冲区中插入0的位置
fread()
示例:
intnread=fread(buf,1,2,fp);
如果(nRead>0)
{
buf[nRead]=0;
我想问题很简单,fprintf()
是否会将所有C字符串结尾的NUL
(\0
或零)发送到文件。答案是否,不会将NUL
发送到文件
FILE *fp = fopen("c:\\te_st.txt", "w+");
fprintf(fp, "aa");
此外,无法使用fprintf()
将NUL
写入文件,因为NUL
将指示字符串的结尾。要写入NUL
,必须使用fwrite()
(带缓冲file*
I/O)或write
(带fd)
如果我写入字符串,fprintf是否将“\0”写入文件
否。
下面的代码将“aa”写入文件
FILE *fp = fopen("c:\\te_st.txt", "w+");
fprintf(fp, "aa");
当我们以十六进制模式查看文件时,我们看到它没有打印任何空终止符:
6161
然后,请显示使用fread
的代码,因为它可能有错误。终止的NUL字节未写入。如何请求fread()从只写入2字节的文件中读取1个3字节长度的元素?此外,使用size=1和count=2调用fread更符合逻辑:fread(buf,1,2,fp)
,请参阅运行简单测试。使用fprintf()
在新文件中写入“aa”,关闭文件,然后在命令提示符下或使用您喜欢的文件管理器/资源管理器检查其大小。文件大小告诉您真相。使用fopen(““c:\\te_st.txt”,“w”)
(不带+
)打开文件或者最好在运行程序之前删除该文件,这只是为了确定。fread
/fwrite
和fprintf
/fscanf
之间的主要区别在于前者不格式化/解析内容,而后者则格式化/解析内容。我不确定这与二进制模式有多大关系(在UNIX上给定的二进制模式与AFAIK没有什么不同)不过,对二进制文件使用fprintf
/fscanf
可能不是一个好主意。在某些情况下,对文本文件使用fread
//fwrite
可能是正确的。(例如,如果您想一次性读取整个文件。)
6161