You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:36:02