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

时间:2015-11-13 18:55:42

标签: 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)
    {
        printf("\n%d",i);

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

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

  system("pause");
  return line;
}

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

如果我理解你想要一个函数,你可以将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] :

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

答案 2 :(得分:-1)

添加Jonathan的回答。 要写入文件,必须以读/写模式打开文件,即

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

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

一件重要的事情是你应该总是关闭你打开的文件。 fclose(ifp);