2015-11-13 4 views
-3

Я пытаюсь сделать метод, который принимает в качестве параметра номер строки и файл, в котором я хочу данныеКак читать и редактировать конкретную строку текстового файла в 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; 
} 
+3

Что вы хотите сказать? –

+0

'fscanf (ifp,"% s ", & line)' Я не думаю, что перед 'line' должно быть &. % s указывает, что он ищет тип 'char *', а строка - 'char *'. –

+0

Дубликат стольких существующих вопросов. И в обычных ответах все упоминают «вы не можете писать отредактированную строку в середине файла» где-то. – usr2564301

ответ

4

You не были особенно ясны о том, что вы пытаетесь сделать, но чтобы писать в определенную строку, просто перейдите к началу этой строки (либо прочитав каждую строку, пока не достигнете той, которая вам нужна, либо с помощью) и затем напишите свои данные.

Проблема в том, что типичные текстовые файлы имеют линии различной длины. Поэтому, если данные, которые вы пишете на эту строку, больше или меньше данных, которые были на линии раньше, тогда вы испортите свои данные.

Единственный способ сделать надежную эту работу:

  1. требовать, чтобы каждая строка в файле всегда известно, фиксированная длина.
  2. Или скопируйте весь файл, записывая новую строку при записи, чем строку в новый файл.
-1

Добавление к ответу Джонатана. Для того, чтобы записать в файл, необходимо открыть файл в режиме чтения/записи, т.е.

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

Это будет открыть файл в режиме чтения/записи при условии, что файл существует. Как хорошая практика программирования, всегда проверяйте, существует ли файл: if(ifp != NULL) {}.

Главное, чтобы вы ДОЛЖНЫ всегда закрывать файл, который вы открыли. fclose(ifp);

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 и затем возвращает строку. Если если заданное число больше, чем количество строк в файле, тогда строка устанавливается в пустую строку и возвращается 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] : 

Если вы хотите обработать/изменить строку другим способом, дайте мне знать, и я буду рад помочь дальше.

Смежные вопросы