【问题标题】:How to read and edit specific line of a text file in C如何在 C 中读取和编辑文本文件的特定行
【发布时间】:2015-11-13 18:55:41
【问题描述】:

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

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

【问题讨论】:

  • 你有什么问题?
  • fscanf(ifp, "%s", &amp;line) 我认为line 前面不应该有&。 %s 表示它正在寻找char* 类型,并且行是char* 类型。
  • 许多现有问题的重复。通常的答案都提到“您不能在文件中间写回已编辑的行”。

标签: c text readfile


【解决方案1】:

您并没有特别清楚自己要做什么,但是要写入特定行,只需移至该行的开头(通过阅读每一行直到到达您想要的行或使用seek()),然后写入你的数据。

问题是典型的文本文件有不同长度的行。因此,如果您写入该行的数据多于或少于之前该行上的数据,那么您将弄乱您的数据。

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

  1. 要求文件中的每一行始终是已知的固定长度。
  2. 或复制整个文件,在写入时写入新行而不是写入新文件。

【讨论】:

    【解决方案2】:

    如果我知道您想要一个函数,您可以将 filenamenumberLine 作为参数传递给该函数,然后让函数返回该行进行编辑,那么您可以使用以下内容:

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

    注意:行号基于(例如0, 1, ...),如果您希望它们从1 运行,请进行调整。

    查看SearchLine 注意 保存该行的数组作为参数之一传递。行有MAXC 字符(根据需要调整)。通过将数组传递给函数,您无需在SearchLine 中分配空间。该函数简单地读取文件中的每一行,直到计数器index == numberLine,然后返回该行。如果给定的数字大于文件中的行数,则将 line 设置为空字符串并返回 NULL

    一个简单的例子是:

    输入文件

    $ cat dat/captnjack.txt
    This is a tale
    Of Captain Jack Sparrow
    A Pirate So Brave
    On the Seven Seas.
    

    输出

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

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

    【讨论】:

      【解决方案3】:

      添加到乔纳森的回答中。 要写入文件,必须以读/写模式打开文件,即

      ifp = fopen(filename, "r+");
      //"r", as in your case, it opens the file in read-only mode.
      

      如果文件存在,这将以读/写模式打开文件。作为一种良好的编程习惯,请始终检查文件是否存在:if(ifp != NULL) {}

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多