我正在尝试创建一个方法,将一个行的数量和我想要数据的文件作为参数
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;
}
答案 0 :(得分:4)
您还没有特别清楚自己要做什么,但要写入特定的一行,只需移动到该行的开头(通过阅读每一行,直到找到您想要的那一行或使用seek()
),然后写下您的数据。
问题是典型的文本文件具有不同长度的行。因此,如果您写入该行的数据多于或少于之前的数据,那么您将搞乱数据。
使这项工作可靠的唯一方法是:
答案 1 :(得分:0)
如果我理解你想要一个函数,你可以将filename
和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] :
如果您希望以不同的方式处理/编辑线路,请告诉我,我很乐意为您提供进一步的帮助。
答案 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);