读取文件中的一行后如何更改行?

问题描述 投票:0回答:1

这是我的代码。读取一行并更改它。

    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);
    }

我知道我可以创建另一个文件来实现,我想知道为什么代码不起作用?

c file fseek
1个回答
0
投票

正如我在评论中指出的那样,您需要在调用

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;
}

打开成功后的错误检查是不存在的,但之前的检查对于安全操作至关重要。

© www.soinside.com 2019 - 2024. All rights reserved.