[英]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()
),然后寫入您的數據。
問題是典型的文本文件有不同長度的行。 因此,如果您寫入該行的數據多於或少於該行之前的數據,那么您就會弄亂您的數據。
使這項工作可靠的唯一方法是:
如果我知道你想要一個函數,你可以將一個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.