C语言写入.txt文件时如何添加有效行终止符?
问题原因与解决方法
你混淆了字符串结束符(ASCII NUL,即\0)和Unix文本文件的行终止符(换行符\n,ASCII 0x0A):
- 你添加的
line[n + 1] = 0;是给C字符串加结束符,但这不是系统认可的行终止符 - Unix系统下,
file命令判断文本文件是否有行终止符,是看内容里有没有\n,而非NUL字符
另外,你那行line[n + 1] = 0;还存在越界风险:n是strlen(line),此时line[n]已经是原字符串的结束符,修改line[n+1]会写到数组的未定义区域,属于错误操作,必须删掉。
具体修改方式(二选一即可)
方式一:在最后一个格式化语句中直接加换行符
把最后一个snprintf改成带\n的格式,直接把换行符包含到内容里:
snprintf(temp, 1000, "%f\n", value3);
方式二:在拼接完成后追加换行符
如果不想修改格式化语句,可以在所有拼接操作完成后,手动追加换行符(注意要确保数组有足够空间):
// 所有拼接完成后执行 size_t line_len = strlen(line); if (line_len + 2 < sizeof(line)) { // 留空间放\n和字符串结束符 line[line_len] = '\n'; line[line_len + 1] = '\0'; }
修改后的关键代码段示例:
// 格式化key和值,准备写入文件 snprintf(line, 5000, "%d, ", key); n = strlen(value1); strncat(line, value1, n); snprintf(temp, 1000, ", %d, ", value2); n = strlen(temp); strncat(line, temp, n); // 方式一:直接在格式化时加换行 snprintf(temp, 1000, "%f\n", value3); n = strlen(temp); strncat(line, temp, n); // 删掉错误的line[n + 1] = 0;这行 // 将内容写入文件 write(status, line, strlen(line));
修改后再执行file 10.txt,就会显示类似10.txt: ASCII text的正常结果,不再提示无行终止符。
内容的提问来源于stack exchange,提问作者ICS
相关产品推荐
相关产品推荐

