0

我正在尝试用 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);
}
4

1 回答 1

0

如果我们假设文件使用单字节字符集,那么在将文本文件从 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;
    }
于 2021-11-17T03:32:58.317 回答