【问题标题】:Command line arguments and ftruncate in CC中的命令行参数和ftruncate
【发布时间】:2016-10-11 03:16:59
【问题描述】:

我正在尝试制作一个 C 程序,通过使用 ftruncate 截断或扩展输入文件,将输入文件的大小更改为所需大小。它还必须使用命令行参数。

例如,以下是有效输入:

./changefilesize data.txt 100

如果data.txt的大小=100,则返回保存文件,大于100则截尾,小于100则扩展文件大小为100。

我在处理输入参数和使用 ftruncate 时遇到问题。我发现的关于 ftruncate 的唯一信息基本上是 man 信息,上面写着:

#include <unistd.h>
int ftruncate(int fildes, off_t length);
int truncate(const char *path, off_t length);

这是我目前所拥有的:

#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
    if ( argc != 2 ) {
        printf("2 inputs expected\n");
    }
    else {
        int length;
        length = atoi (argv[1]);
        FILE *file = fopen(argv[0], "r");
        int ftruncate(int file, off_t length);
        fclose(file);
    }
}

如果我输入./changefilesize data.txt 100,我会得到2 inputs expected,但我不明白为什么。

编辑:根据答案更新代码:

#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
    long length;
    length = atoi (argv[2]);
    FILE *file = fopen(argv[1], "w");
    ftruncate (fileno(file), length);
    fclose(file);
}

【问题讨论】:

  • 不带任何参数运行它并打印argc
  • 我仍然收到2 inputs expected
  • 如果您正确打印argc,这是不可能得到的。你应该得到一个号码。
  • 这就是我打印 argc printf ("%d\n", argc); 的方式
  • 那个 printf 的输出是什么?

标签: c file file-io io truncate


【解决方案1】:

argv[0] 指向的字符串代表程序名称,因此您收到 3 个参数:changefilesizedata.txt100

这里

    FILE *file = fopen(argv[0], "r");
    int ftruncate(int file, off_t length);
    fclose(file);

第二行是原型(不是对ftruncate的调用)更改为

    FILE *file = fopen(argv[1], "w"); /* 1 instead of 0 and "w" instead of "r" */
    ftruncate(fileno(file), 100);
    fclose(file);

注意ftruncate文件必须是可写的。

【讨论】:

  • 我更新了我的代码并将其添加到问题中。当我输入./changefilezise data.txt 100data.txt 时,data.txt 变成了一个 100 字节的文件,但其内容被不可见的字符替换,即文件为空但大小为 100 字节。 data.txt 的大小为 201,由 200 个“1”字符和一个换行符组成。如何保存内容?
  • 如果文件之前大于长度,多余的数据将被丢弃。如果它以前比长度短,则未指定文件是更改还是增加了大小。如果文件被扩展,扩展区域看起来好像是零填充的。
【解决方案2】:

程序的第一个参数是它的名称(在 argv[0] 中)。所以如果你给出 2 个参数,argc 就是 3(路径 + 2 个参数)。

更多详情请见this question

【讨论】:

  • 所以我解决了这个问题,但现在当我运行程序时,输出文件的大小没有更改为 50。
  • @user6005857 这是一个不同的问题。请在这里提出一个新问题:*.com/questions/ask
最近更新 更多