簡體   English   中英

如何在C中讀取和編輯文本文件的特定行

[英]How to read and edit specific line of a text file in C

我正在嘗試創建一種方法,該方法將行號和我想要數據的文件作為參數

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

您還沒有特別清楚要做什么,但是要寫入特定行,只需移至該行的開頭(通過閱讀每一行直到到達您想要的行或使用seek() ),然后寫入您的數據。

問題是典型的文本文件有不同長度的行。 因此,如果您寫入該行的數據多於或少於該行之前的數據,那么您就會弄亂您的數據。

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

  1. 要求文件中的每一行始終是已知的固定長度。
  2. 或者復制整個文件,在寫入新文件時寫入新行而不是行到新文件。

如果我知道你想要一個函數,你可以將一個filename和一個numberLine作為參數numberLine給它,然后讓函數返回該行進行編輯,那么你可以使用如下所示的內容:

#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] :

如果您希望以不同的方式處理/編輯該行,請告訴我,我很樂意為您提供進一步的幫助。

添加到喬納森的答案。 要寫入文件,必須以讀/寫模式打開文件,即,

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

如果文件存在,這將以讀/寫模式打開文件。 作為一個好的編程習慣,始終檢查文件是否存在: if(ifp != NULL) {}

一件重要的事情是你應該總是關閉你打開的文件。 fclose(ifp);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM