Если я понимаю, что вы хотите функцию, вы можете передать 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
и затем возвращает строку. Если если заданное число больше, чем количество строк в файле, тогда строка устанавливается в пустую строку и возвращается 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] :
Если вы хотите обработать/изменить строку другим способом, дайте мне знать, и я буду рад помочь дальше.
Что вы хотите сказать? –
'fscanf (ifp,"% s ", & line)' Я не думаю, что перед 'line' должно быть &. % s указывает, что он ищет тип 'char *', а строка - 'char *'. –
Дубликат стольких существующих вопросов. И в обычных ответах все упоминают «вы не можете писать отредактированную строку в середине файла» где-то. – usr2564301