Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ fprintf是否写入'\0';如果我写了一个字符串,你会把它写到文件中吗?_C++ - Fatal编程技术网

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