如何在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] :