windows、linux回车换行“0D0A”并非“0A”问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows、linux回车换行“0D0A”并非“0A”问题相关的知识,希望对你有一定的参考价值。
在windows系统上得到一批数据保存为txt格式,上传到linux系统被告知换行符不规范,换行符是“0D0A”并非“0A”。哪位大虾知道怎么将windows下的回车换行“0D0A”转换成linux下的换行“0A”么。用linux命了可以实现么?或是UE?或是其他什么方法。。。?急。。。雪地跪等。。。。
1、如果没有安装dos2unix命令,请使用yum命令安装dos2unix: yum install dos2unix*。2、在Linux终端,执行命令:dos2unix 文件名。
我下午遇到同样问题,同事忙帮解决的。 参考技术A 1,ue 查找\r\n替换为\n
2,vi 打开windows文件,输入 :se ff=unix 然后 :w 保存 参考技术B 还有一个命令比较直接
dos2unix 参考技术C linux命令
sed -i 's/\r$//' filename本回答被提问者采纳
C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)
文章目录
(json_string.json)
"person":
"firstname": "z",
"lastname": "jadena",
"email": "jadena@126.com",
"age": 8,
"height": 1.17
用malloc动态分配读取内容的存储空间
#pragma warning(disable : 4996)
#include <stdio.h>
int main()
FILE* fp;
int file_size; //保存文件字符数
char* tmp; //将文件内容读到此指针位置
fp = fopen("./json_string.json", "r"); //打开文件
fseek(fp, 0, SEEK_END); //将文件指针指向该文件的最后
file_size = ftell(fp); //根据指针位置,此时可以算出文件的字符数
printf("文件字符数为 %d\\n", file_size);
tmp = (char*)malloc(file_size * sizeof(char)); //根据文件大小为tmp动态分配空间
memset(tmp, '\\0', file_size * sizeof(char)); //初始化此控件内容,否则可能会有乱码
fseek(fp, 0, SEEK_SET); //重新将指针指向文件首部
fread(tmp, sizeof(char), file_size, fp); //开始读取整个文件
printf("文件内容为\\n%s", tmp);
return 0;
运行结果:
文件字符数为 141
文件内容为
"person":
"firstname": "z",
"lastname": "jadena",
"email": "jadena@126.com",
"age": 8,
"height": 1.17
事先分配一个较大的存储空间
#pragma warning(disable : 4996)
#include <stdio.h>
int main()
FILE* fp;
long file_size; //保存文件字符数
char tmp[2048] = 0; //将文件内容读到此指针位置
fp = fopen("./json_string.json", "r"); //打开文件
fseek(fp, 0, SEEK_END); //将文件指针指向该文件的最后
file_size = ftell(fp); //根据指针位置,此时可以算出文件的字符数(arnold:这个计算的时候貌似把回车符也计算进去了,但是读取保存的时候不会读回车符)
printf("文件字符数为 %d\\n", file_size);
fseek(fp, 0, SEEK_SET); //重新将指针指向文件首部
if (file_size * sizeof(char) >= sizeof(tmp)) //arnold:在没有回车符的情况下,这样是百分百不会出错的
printf("tmp太小,不够大\\n");
return 0;
fread(tmp, sizeof(char), file_size, fp); //开始读取整个文件
printf("文件内容为:\\n%s", tmp);
return 0;
VS上编译运行结果:
文件字符数为 141
文件内容为:
"person":
"firstname": "z",
"lastname": "jadena",
"email": "jadena@126.com",
"age": 8,
"height": 1.17
ubuntu上编译运行结果:
[root@ubuntu /arnold_test/test]6# ./a.out
文件字符数为 134
文件内容为:
"person":
"firstname": "z",
"lastname": "jadena",
"email": "jadena@126.com",
"age": 8,
"height": 1.17
做成了函数形式
#pragma warning(disable : 4996)
#include <stdio.h>
int read_json(FILE* fp, char* tmp, size_t size_tmp)
long file_size; //保存文件字符数
fseek(fp, 0, SEEK_END); //将文件指针指向该文件的最后
file_size = ftell(fp); //根据指针位置,此时可以算出文件的字符数(arnold:这个计算的时候貌似把回车符也计算进去了,但是读取保存的时候不会读回车符)
printf("文件字符数为 %d\\n", file_size);
fseek(fp, 0, SEEK_SET); //重新将指针指向文件首部
if (file_size * sizeof(char) >= size_tmp) //arnold:在没有回车符的情况下,这样是百分百不会出错的
printf("tmp太小,不够大\\n");
return -1;
fread(tmp, sizeof(char), file_size, fp); //开始读取整个文件
return 0;
int main()
FILE* fp;
char tmp[2048] = 0; //将文件内容读到此指针位置
fp = fopen("./json_string.json", "r"); //打开文件
read_json(fp, tmp, sizeof(tmp));
printf("文件内容为:\\n%s", tmp);
return 0;
测试ftell()
(json_string)
a
b
c
d
e
f
g
windows上
文件字符数为 7
文件内容为:
a
b
c
文件字符数为 10
文件内容为:
a
b
c
d
文件字符数为 13
文件内容为:
a
b
c
d
e
ubuntu上
[root@ubuntu /arnold_test/test]8# ./a.out
文件字符数为 14
文件内容为:
a
b
c
d
e
f
g
结论:ubuntu貌似会把最后一行换行符补全(没有换行也会补个换行),然后每行只计算一个换行符;windows最后一行不会补全换行符,每行会计算换行符和回车符
以上是关于windows、linux回车换行“0D0A”并非“0A”问题的主要内容,如果未能解决你的问题,请参考以下文章
Windows 和 Linux 中的换行与回车的区别,Windows下编写的Shell脚本,直接放到linux/unix下执行会报错
C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)
C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)