这是我的代码。读取一行并更改它。
char buf[SIZE];
while (fgets(buf,SIZE,fp) != NULL)
{
to_upper(buf);
fseek(fp,-1L,SEEK_CUR);
fputs(buf,fp);
fseek(fp,1L,SEEK_CUR);
}
我知道我可以创建另一个文件来实现,我想知道为什么代码不起作用?
正如我在评论中指出的那样,您需要在调用
fgets()
之前捕获当前的读取位置;然后您重置该位置并写入修改后的数据,并且您需要在右侧之后进行某种查找,以便您可以再次读取。
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void to_upper(char *buffer)
{
unsigned char u;
while ((u = *buffer) != '\0')
*buffer++ = toupper(u);
}
int main(int argc, char **argv)
{
const char *fname = "input.txt";
if (argc > 2)
{
fprintf(stderr, "Usage: %s [file]\n", argv[0]);
exit(EXIT_FAILURE);
}
if (argc == 2)
fname = argv[1];
FILE *fp = fopen(fname, "r+");
if (fp == NULL)
{
fprintf(stderr, "%s: failed to open file '%s' for read/write: %d %s\n",
argv[0], fname, errno, strerror(errno));
exit(EXIT_FAILURE);
}
char buffer[1024];
long pos = ftell(fp);
while (fgets(buffer, sizeof(buffer), fp) != 0)
{
to_upper(buffer);
fseek(fp, pos, SEEK_SET);
fputs(buffer, fp);
fseek(fp, 0, SEEK_CUR);
pos = ftell(fp);
}
fclose(fp);
return 0;
}
打开成功后的错误检查是不存在的,但之前的检查对于安全操作至关重要。