我阅读了一个文本文件,效果很好。
std::string str_buf = "";
FILE *file = fopen("/home/pi/log_2019-03-07.txt", "r");
if (file != NULL)
{
while (true)
{
char buffer[MAX_BUFFER_SIZE] = { 0x00, };
size_t rSize = fread(buffer, MAX_BUFFER_SIZE, sizeof(char), file);
str_buf += buffer;
if (rSize == 0)
break;
}
printf("%s", str_buf.data());
fclose(file);
}
然后我尝试将其写入相同的路径,即另一个名称。这是代码:
FILE *writefile = fopen("/home/pi/WriteTest.txt", "wb");
if (writefile != NULL)
{
int offset = 0;
while (true)
{
size_t wSize = fwrite(&str_buf.data()[offset], sizeof(char), strlen(str_buf.data()) - 1, writefile);
offset += (int)wSize;
if (offset >= strlen(str_buf.data()))
break;
}
fclose(writefile);
}
如果我尝试执行此代码,它将起作用。我打开WriteTest.txt
,它具有相同的字符串。完全一样。
但是我发现WriteTest.txt
的容量几乎是阅读文字的两倍。
为什么会这样?
答案 0 :(得分:1)
size_t wSize = fwrite(&str_buf.data()[offset], sizeof(char), strlen(str_buf.data()) - 1, writefile);
您开始在偏移量&str_buf.data()[offset]
处写入文本,但是在位置0处开始写入字符串的长度。您写的offset
个字节过多。你应该
size_t wSize = fwrite(&str_buf.data()[offset], sizeof(char),
strlen(str_buf.data()) - offset, writefile);
此外,您无需写字符串长度或NUL终止符。因此,您很难弄清楚要读多少,除非像您的简单示例一样,该文件位于文件的末尾。
最后,最好使用str_buf.length()
而不是strlen。它更快,并且可以与中间带有NUL的字符串一起使用。