c - 将多行写回文件,文件长度错误
问题描述
我想获取多行文本文件的内容,并将其放回文件中。
但是,我对文件长度有疑问。我添加的空终止符 (0) 在一些奇怪的字符之后。
我的 f_length 有问题吗?
编辑:如果我将文件的行尾设置为 Unix (LF),我没有问题。所以看来我的代码与 Windows 行尾不兼容。如何处理 Windows 文本文件?
int main()
{
FILE *fp = NULL;
int f_length;
char *buffer = NULL;
size_t size = 0;
fp = fopen(FILENAME, "r+");
fseek(fp, 0, SEEK_END);
f_length = ftell(fp);
rewind(fp);
buffer = malloc((f_length + 1) * sizeof(*buffer));
fread(buffer, f_length, 1, fp);
buffer[f_length] = 0;
printf("%s\n", buffer);
fp = fopen(FILENAME, "w+");
fputs(buffer, fp);
fclose(fp);
return 0;
}
解决方案
改为使用fp = fopen(FILENAME, "rb+");
。对于文本文件,您将在阅读时替换换行符(您已经在评论中注意到了这一点)。在某些情况下,新格式更短(“\r”或“\n”,而文件本身包含“\r\n”),因此 f_length 将大于实际读取的数据。
或者您可以使用逐行阅读功能,它们是为文本模式文件设计的。
推荐阅读
- azure-blob-storage - IE 中的 Azure 认知服务(文本到语音)和音频问题(源无效)
- mysql - 尝试使用选择查询值进行更新时出现 MySQL 错误
- azure - SOAP-REST 连接器中使用的 WSDL 文件的格式应该是什么?
- javascript - 在 Javascript 中,如何在继续其余过程之前先执行 image.onload 函数
- asp.net-core - 如何在 EF Core 3.0 中使用 FromSqlInterpolated 执行多个参数的存储过程?
- ruby-on-rails - 无法使用 db:migrate 在 Rails 中创建数据库?
- c# - 如何将 MainPage.xaml 的元素访问到 uwp 应用程序中的另一个页面?
- php - PHP Google Drive API 创建空的 XML 文件
- python - 无法以与使用 virtualenv 相同的方式使用 venv 定义 python 包(版本)
- vb.net - 如何使用 VB.NET 将 MS SQL 中的 chart1 保存为图像?