0

我正在寻找更快的方法来完全更改文件的内容。例子后面就清楚了:

一个.txt

我是一个非常长(也许不会太长)的文件。我很确定我可以更长。

运行程序后,根据用户的输入,它应该变成例如:

用户输入

你好!

然后我尝试使用fwrite. 问题是文件的其余部分仍然存在,所以我有类似的东西:

一个.txt

嗨!ma 非常非常长(可能不会太长)的文件。我很确定我可以更长

经过一些研究,这是我所做的:

FILE
    *a;

char
    buffer[500];

a = fopen("a.txt", "r");
    fread(buffer, sizeof(char), 500, a);

    printf("%s\n", buffer);

a = freopen("a.txt", "w", a);

    scanf("%s", buffer);

            // rewind(a);
            // fwrite(buffer, sizeof(char), strlen(buffer), a);

    fwrite(buffer, sizeof(char), 10, a);
    fclose(a);

虽然它有效,但我想知道是否有更好的方法来做到这一点。

4

3 回答 3

0

“w”标志应该创建一个文件,如果存在则截断任何现有内容。这就是你需要的。

我以前没有使用freopen()过,但怀疑这与问题有关。我会尝试简单地关闭输入文件fclose(),然后再次使用fopen()

于 2013-01-23T00:48:32.763 回答
0

您可以在截断文件ftruncate()后使用 POSIX 函数。fwrite()

于 2013-01-23T00:51:41.623 回答
0

我不知道使用便携式 C 的更好方法。

您的实施存在一些小问题。

您不会检查可能发生的任何错误,这在现实世界中很重要。特别是freopen可能会返回NULL错误,如果您将其分配给您的原始指针,您将失去fclose对该文件的能力。

您还应该记住,普通的 C 字符串以 0 字节结尾,但fread读取的是原始字节,因此您应该为该零字节保留空间并提供它。 scanf将写入零字节,因此您可以使用strlen来确定fwrite要写入的字节数,而不是硬编码 10。

finallyscanf很容易模拟东西,但是如果用户提供超过 499 个字节,那么你现在拥有它的方式会导致缓冲区溢出,这可能会导致非常糟糕的事情。

于 2013-01-23T01:15:19.600 回答