ftruncate与msys2无法正常工作

时间:2018-02-08 12:10:45

标签: c truncate msys2

我试图修改文件的大小。我正在使用msys2。我的代码如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void dummy_file(){
    FILE *f = fopen("file.txt", "w");
    if (f == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }

    /* print some text */
    const char *text = "Write this to the file";
    fprintf(f, "Some text: %s\n", text);

    /* print integers and floats */
    int i = 1;
    float py = 3.1415927;
    fprintf(f, "Integer: %d, float: %f\n", i, py);

    /* printing single chatacters */
    char c = 'A';
    fprintf(f, "A character: %c\n", c);
    fclose(f);
}

void print_size(){
    FILE *f = fopen("file.txt", "r");
    long sz = 0;
    if (f == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }
    fseek(f, 0L, SEEK_END);
    sz = ftell(f);
    printf("%ld\n",sz);
    fclose(f);
}

void truncate_file(){
    FILE *f = fopen("file.txt", "w");
    if (f == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }
    ftruncate(fileno(f), 40);
    fclose(f);
}

int main()
{
    printf("Begin\n");
    dummy_file();
    print_size();
    // truncate_file();
    print_size();
    printf("End\n");
    return 0;
}

输出如下:

开始    80    40    端

文件已更改为40个字节,但内容大量为空值。

我做错了什么?是否有替代方法可以在保留文件内容时截断文件?

1 个答案:

答案 0 :(得分:1)

fopen模式下打开w文件时,会将文件截断为零长度。之后,当您运行ftruncate时,它将使用\0填充文件以达到您指定的大小。

来自fopen手册页,

  

w将文件截断为零长度或创建用于写入的文本文件。          流位于文件的开头。

您可以使用r+模式打开它,如果该文件存在,则不会截断该文件并允许写入。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void dummy_file(){
    FILE *f = fopen("file.txt", "w");
    if (f == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }

    /* print some text */
    const char *text = "Write this to the file";
    fprintf(f, "Some text: %s\n", text);

    /* print integers and floats */
    int i = 1;
    float py = 3.1415927;
    fprintf(f, "Integer: %d, float: %f\n", i, py);

    /* printing single chatacters */
    char c = 'A';
    fprintf(f, "A character: %c\n", c);
    fclose(f);
}

void print_size(){
    FILE *f = fopen("file.txt", "r");
    long sz = 0;
    if (f == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }
    fseek(f, 0L, SEEK_END);
    sz = ftell(f);
    printf("%ld\n",sz);
    fclose(f);
}

void truncate_file(){
    FILE *f = fopen("file.txt", "r+");
    if (f == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }
    ftruncate(fileno(f), 40);
    fclose(f);
}

int main()
{
    printf("Begin\n");
    dummy_file();
    print_size();
    truncate_file();
    print_size();
    printf("End\n");
    return 0;
}

扩展代码时需要考虑的一个注意事项:如果没有遵循某些步骤,混合文件描述符和STD I / O流会导致未定义的行为(请参阅this answer指向{{3}更多信息)。