如何用C语言实现UNIX格式文本文件转DOS格式
UNIX转DOS行尾格式C语言实现
你参考的原代码是DOS转UNIX的逻辑,核心是压缩行尾字符,要改成UNIX转DOS需要调整为扩展行尾的逻辑,核心修改如下:
- 原代码直接复用读入文件的内存存储转换后内容,由于UNIX转DOS后文件会变大,需要先遍历一次原内容计算转换后的总大小,再重新申请足够的内存存储新内容
- 替换逻辑改为:仅对前面没有
\r的\n补充前缀\r,避免原有DOS格式的行尾被重复添加\r - 写入文件时使用新生成的内容数组即可
完整可运行代码如下:
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> // 执行失败返回负数,成功返回0 int main() { const char* filename = "textfile.txt"; // 获取文件大小,此处假设文件大小不超过UINT_MAX struct stat info; if (stat(filename, &info) != 0) return -1; size_t filesize = (size_t)info.st_size; // 分配读文件用的内存 char* content = (char*)malloc(filesize); if (content == NULL) return -2; // 二进制只读方式打开文件 FILE* fptr = fopen(filename, "rb"); if (fptr == NULL) { free(content); return -3; } // 读取文件内容后关闭文件 size_t count = fread(content, filesize, 1, fptr); fclose(fptr); if (count != 1) { free(content); return -4; } // 第一遍遍历计算转换后的文件大小 size_t newsize = 0; for (long i = 0; i < filesize; ++i) { if (content[i] == '\n') { // 行尾是单独\n的话,转换后占2字节,已经是\r\n的话占1字节 if (i == 0 || content[i-1] != '\r') { newsize += 2; } else { newsize += 1; } } else { newsize += 1; } } // 没有需要转换的内容直接退出 if (newsize == filesize) { free(content); return 0; } // 分配存储转换后内容的内存 char* new_content = (char*)malloc(newsize); if (new_content == NULL) { free(content); return -5; } // 第二遍遍历完成转换 size_t pos = 0; for (long i = 0; i < filesize; ++i) { if (content[i] == '\n' && (i == 0 || content[i-1] != '\r')) { new_content[pos++] = '\r'; new_content[pos++] = '\n'; } else { new_content[pos++] = content[i]; } } // 二进制写方式打开文件,覆盖原有内容 fptr = fopen(filename, "wb"); if (fptr == NULL) { free(content); free(new_content); return -6; } // 写入转换后的内容 count = fwrite(new_content, newsize, 1, fptr); fclose(fptr); if (count != 1) { free(content); free(new_content); return -7; } // 释放申请的内存 free(content); free(new_content); return 0; }
内容的提问来源于stack exchange,提问作者Pedro Barata Fernandes
相关产品推荐
相关产品推荐

