如何将文本文件从 DOS 格式转换为 UNIX 格式

How to convert a text file from DOS format to UNIX format

我正在尝试用 C 编写一个程序,它读取一个文本文件并将 \r\n 替换为 \n 到同一个文件,将以 DOS 结尾的行转换为 UNIX。我使用 fgetc 并将文件视为二进制文件。提前致谢。

#include <stdio.h>

int main()
{
    FILE *fptr = fopen("textfile.txt", "rb+");
    if (fptr == NULL)
    {
        printf("erro ficheiro \n");
        return 0;
    }

     while((ch = fgetc(fptr)) != EOF) {
          if(ch == '\r') {
           fprintf(fptr,"%c", '\n');
        } else {
         fprintf(fptr,"%c", ch);
        }
    }

    fclose(fptr);
}

如果我们假设文件使用单字节字符集,那么在将文本文件从 DOS 转换为 UNIX 时,我们只需要忽略所有 '\r' 字符即可。

我们还假设文件的大小小于最大的无符号整数。

我们做这些假设的原因是为了让示例简短。

请注意,如您所问,下面的示例会覆盖原始文件。通常你不应该这样做,因为如果发生错误,你可能会丢失原始文件的内容。

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

// Return a negative number on failure and 0 on success.
int main()
{
    const char* filename = "textfile.txt";

    // Get the file size. We assume the filesize is not bigger than UINT_MAX.
    struct stat info;
    if (stat(filename, &info) != 0)
        return -1;
    size_t filesize = (size_t)info.st_size;

    // Allocate memory for reading the file
    char* content = (char*)malloc(filesize);
    if (content == NULL)
        return -2;

    // Open the file for reading
    FILE* fptr = fopen(filename, "rb");
    if (fptr == NULL)
        return -3;

    // Read the file and close it - we assume the filesize is not bigger than UINT_MAX.
    size_t count = fread(content, filesize, 1, fptr);
    fclose(fptr);
    if (count != 1)
        return -4;

    // Remove all '\r' characters 
    size_t newsize = 0;
    for (long i = 0; i < filesize; ++i) {
        char ch = content[i];
        if (ch != '\r') {
            content[newsize] = ch;
            ++newsize;
        }
    }

    // Test if we found any
    if (newsize != filesize) {
        // Open the file for writing and truncate it.
        FILE* fptr = fopen(filename, "wb");
        if (fptr == NULL)
            return -5;

        // Write the new output to the file. Note that if an error occurs,
        // then we will lose the original contents of the file.
        if (newsize > 0)
            count = fwrite(content, newsize, 1, fptr);
        fclose(fptr);
        if (newsize > 0 && count != 1)
            return -6;
    }

    // For a console application, we don't need to free the memory allocated
    // with malloc(), but normally we should free it.

    // Success 
    return 0;
} // main()

要仅删除“\r”后跟“\n”,请将循环替换为以下循环:

    // Remove all '\r' characters followed by a '\n' character
    size_t newsize = 0;
    for (long i = 0; i < filesize; ++i) {
        char ch = content[i];
        char ch2 = (i < filesize - 1) ? content[i + 1] : 0;
        if (ch == '\r' && ch2 == '\n') {
            ch = '\n';
            ++i;
        }
        content[newsize++] = ch;
    }