在c中写一行

时间:2013-12-07 13:03:52

标签: c file stdio

我有一个c项目,我有严重的问题,我想打开文件并用“ * ”替换行号nb(nb是一个int)。这是我的代码可以帮助我一些吗?它告诉我我想要替换这个词的意思是指针指向想要的线但没有任何事情发生。请帮助我

#include <stdio.h>

int main( void )
{
    FILE * f;
    char ch[1024];
    int i, nb;

    i = 0;
    scanf( "%d", &nb ) ;
    f = fopen( "dict.txt", "r+t" );

    while( i < nb )
     {
        fscanf( f, "%s", ch ) ;
        i++;
     }

    printf( "%s", ch );
    fprintf( f, "%s", "****" );
    fclose( f );
}

1 个答案:

答案 0 :(得分:1)

您已打开文件进行读写。根据{{​​3}}(我假设您正在使用Visual Studio的文件的r+t模式):

  

当指定“ r + ”,“ w + ”或“ a + ”访问类型时,允许读取和写入(该文件据说是“更新”的开放。但是,当您从读取切换到写入时,输入操作必须遇到EOF标记。如果没有EOF,则必须使用对文件定位功能的干预调用。文件定位功能为 fsetpos fseek 快退

要记住的其他一些事项:

  • fscanf读取带%s的字符串时,它一次只读取一个字,而不是整行。使用fgets比使用fscanf更容易阅读整行输入。
  • 文件由字节流组成。如果要替换的行长度为47个字符,则fprintf(f, "%s", "****")将仅替换行中的前四个字节。
  • 这意味着如果你想要替换行 #nb ,你需要读取行,找出它有多长,然后回到行的开头并打印出来正确的星号数。

尝试这样的事情:

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

int main()
{
    FILE * f;
    char ch[1024];
    int i,nb ;
    fpos_t beginning_of_line;

    i=0;
    scanf("%d",&nb) ;
    f = fopen("dict.txt", "r+t");
    while (i<nb)
      {
        fgetpos(f, &beginning_of_line);
        fgets(ch, 1024, f);
        i++;
      }

    fseek(f, beginning_of_line, SEEK_SET);  // return to beginning of line
    for (i = 0; ch[i] != '\n'; ++i) {
      fputc('*', f);
    }
    fclose(f);
}