gpt4 book ai didi

c - 为什么 fputc 不更新此代码段中的字符?

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:36 27 4
gpt4 key购买 nike

#include <stdio.h>

int main() {
FILE *fp;
char ch = 'g';
fp = fopen("temp.txt", "r+");
while (feof(fp)) {
fputc(ch,fp);
fseek(fp, 1, SEEK_CUR);
}
fclose(fp);
}

根据这个问题,我希望代码将所有字符更新为“g”。但是我看到它什么也没做。

最佳答案

所以你想把文件中的所有字节都改成字母g。在文本流上以可移植且可靠的方式执行此操作非常困难1。我建议您改为以二进制模式打开流并执行如下操作:

#include <errno.h>
#include <stdio.h>
#include <string.h>

int main(void) {
char buf[4096];
long len;
FILE *fp;

fp = fopen("temp.txt", "rb+");
if (fp == NULL) {
fprintf(stderr, "cannot open temp.txt: %s\n", strerror(errno));
return 1;
}
while ((len = fread(buf, 1, sizeof buf, fp)) > 0) {
fseek(fp, -len, SEEK_CUR);
memset(buf, 'g', len);
fwrite(buf, 1, len, fp);
fseek(fp, 0, SEEK_CUR);
}
fclose(fp);
return 0;
}

你的问题不是很清楚:如果通过将所有字符更新为'g'你的意思是保留不变的不是字符的字节,例如换行符,代码会多一点微妙。编写一个过滤器来读取流并生成具有更改的输出流要简单得多:

例如,这是一个将所有字母更改为 g 的过滤器:

#include <ctype.h>
#include <stdio.h>

int main(void) {
int c;

while ((c = getchar()) != EOF) {
if (isalpha(c))
c = 'g';
putchar(c);
}
return 0;
}

  1. 不能在文本模式下使用ftell() 来计算文件中的字符数。您必须使用二进制模式:

C 7.21.9.4 the ftell function

Synopsis

#include <stdio.h>
long int ftell(FILE *stream);

Description

The ftell function obtains the current value of the file position indicator for the stream pointed to by stream. For a binary stream, the value is the number of characters from the beginning of the file. For a text stream, its file position indicator contains unspecified information, usable by the fseek function for returning the file position indicator for the stream to its position at the time of the ftell call; the difference between two such return values is not necessarily a meaningful measure of the number of characters written or read.

Returns

If successful, the ftell function returns the current value of the file position indicator for the stream. On failure, the ftell function returns −1L and stores an implementation-defined positive value in errno.

即使计算使用 getc() 读取的字符数并从文件开头写入相同数量的 'g' 也不起作用:换行符序列可能会使用多于一个字节,并且在某些遗留系统上可能不会覆盖末尾的某些文件内容。

关于c - 为什么 fputc 不更新此代码段中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45099960/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com