如何在C语言中读取和编辑文本文件的特定行

如何在C语言中读取和编辑文本文件的特定行,c,text,readfile,C,Text,Readfile,我正在尝试创建一个方法,该方法将一行的编号和需要数据的文件作为参数 char SearchLine(int numberLine,char[100] fileName) { char line[256]; int nline=numberLine; int i=0; FILE *ifp; ifp = fopen(fileName, "r"); while (fscanf(ifp, "%s", &line) == 1) { if(i==nline)

我正在尝试创建一个方法,该方法将一行的编号和需要数据的文件作为参数

char SearchLine(int numberLine,char[100] fileName)
{
  char line[256];
  int nline=numberLine;
  int i=0;
  FILE *ifp;
  ifp = fopen(fileName, "r");


  while (fscanf(ifp, "%s", &line) == 1)
  {
    if(i==nline)
    {
        printf("\n%d",i);

    }
    else if(i<nline)
    {
        i++;
    }

  }
  printf("\n%s",line);
  printf("\n%s\n\n",i);

  system("pause");
  return line;
}
char搜索行(int numberLine,char[100]文件名)
{
字符行[256];
int nline=数字线;
int i=0;
文件*ifp;
ifp=fopen(文件名,“r”);
而(fscanf(ifp、%s、&line)==1)
{
如果(i==nline)
{
printf(“\n%d”,i);
}

否则,如果(我你没有特别清楚你想做什么,但是要写一行,只需移动到该行的开头(通过读取每一行直到找到你想要的行,或者使用
seek()
),然后写入数据

问题是,典型的文本文件具有不同长度的行。因此,如果写入该行的数据大于或小于之前该行上的数据,则会弄乱数据

使该工作可靠的唯一方法是:

  • 要求文件中的每一行始终为已知的固定长度
  • 或者复制整个文件,在写入时写入新行,而不是将行写入新文件

  • 补充乔纳森的回答。 要写入文件,必须以读/写模式打开文件,即

    ifp = fopen(filename, "r+");
    //"r", as in your case, it opens the file in read-only mode.
    
    如果文件存在,这将以读/写模式打开文件。作为一种良好的编程实践,请始终检查文件是否存在:
    if(ifp!=NULL){}


    一件重要的事情是,您应该始终关闭已打开的文件。
    fclose(ifp);

    如果我理解您需要一个函数,可以将
    文件名和
    数字线作为参数传递给它,然后让该函数返回该行进行编辑,那么您可以使用如下方法:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXC 256
    
    char *SearchLine (int numberLine, char *line, char *filename);
    
    int main (int argc, char **argv) {
    
        if (argc < 2) {
            fprintf (stderr, "error: insufficient input. usage: %s filename.\n",
                    argv[0]);
            return 1;
        }
    
        char linebuf[MAXC] = {0};
        int linenum = argc > 2 ? atoi (argv[2]) : 3;
    
        SearchLine (linenum, linebuf, argv[1]);
    
        printf ("\n line[%3d] : %s\n", linenum, linebuf);
    
        return 0;
    }
    
    /* read line number 'numberLine' from 'filename' into 'line'.
     * Returns line on success, NULL otherwise. (numberline is zero based)
     */
    char *SearchLine (int numberLine, char *line, char *filename)
    {
        int index = 0;
        FILE *fp = fopen (filename, "r");
        if (!fp) {
            fprintf (stderr, "SearchLine() error: file open failed '%s'\n",
                    filename);
            return NULL;
        }
    
        while (fgets (line, MAXC, fp)) {
            if (index == numberLine)
                return line;
            if (index > numberLine)
                break;
            index++;
        }
        fclose (fp);
    
        *line = 0;
        return NULL;
    }
    
    输出

    $ ./bin/fgets_linenum dat/captnjack.txt 1
    
     line[  1] : Of Captain Jack Sparrow
    
    $ ./bin/fgets_linenum dat/captnjack.txt 4
    
     line[  4] :
    

    如果您希望以不同的方式处理/编辑该行,请告诉我,我很乐意提供进一步帮助。

    您的问题是什么?
    fscanf(ifp,“%s”,&line)<代码> >我不认为应该有一个A&在前面的代码>行>代码>。%s表示它正在寻找一个<代码> char *<代码>类型,并且行是“代码> char *<代码>类型。许多现有问题的副本。并且通常的回答都提到“你不能在文件的中间写一个编辑过的行”。
    
    $ ./bin/fgets_linenum dat/captnjack.txt 1
    
     line[  1] : Of Captain Jack Sparrow
    
    $ ./bin/fgets_linenum dat/captnjack.txt 4
    
     line[  4] :