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
  

参考文章:C语言读出整个文件内容以及部分文件函数的讲解

做成了函数形式

#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”问题的主要内容,如果未能解决你的问题,请参考以下文章

mapreduce 识别windows linux换行符

linux与windows文本文件间的转换:针对回车换行

Windows 和 Linux 中的换行与回车的区别,Windows下编写的Shell脚本,直接放到linux/unix下执行会报错

回车和换行在linux下和windows下

C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)

C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)