2013-04-23 2 views
0

Я пытаюсь написать функцию, которая печатает определенную строку из текстового файла на основе указанного числа. Например, предположим, что файл содержит следующее:Как извлечь определенную пронумерованную строку из текстового файла? (C)

1 hello1 one 
2 hello2 two 
3 hello3 three 

Если задано номер «3», то функция выведет «hello3 три». Если указанным числом является «1», выход функции будет «hello1 one».

Я очень новичок в C, но вот моя логика до сих пор.

Я предполагаю, что во-первых, мне нужно найти символ «число» внутри файла. И что? Как я могу написать строку без номера? Как мне найти «номер»? Я уверен, что это очень просто, но я понятия не имею, как это сделать. Вот что у меня есть до сих пор:

void readNumberedLine(char *number) 
{ 
    int size = 1024; 
    char *buffer = malloc(size); 
    char *line; 
    FILE *fp; 
    fp = fopen("xxxxx.txt", "r"); 
    while(fp != NULL && fgets(buffer, sizeof(buffer), fp) != NULL) 
    { 
     if(line = strstr(buffer, number)) 
     //here is where I am confused as to what to do.   
    } 
    if (fp != NULL) 
    { 
      fclose(fp); 
    } 
} 

Любая помощь вообще была бы весьма признательна.

+0

По определению проблемы, я думал, что вам нужна 3-я строка независимо от содержания. Однако ваше решение, похоже, находит строку, содержащую «3». Какой вы хотите? – Arun

+0

@Arun, я думаю, ему нужна 3-я строка, но он написал код с неожиданным результатом для достижения этой цели. – MYMNeo

+0

К сожалению, если параметр равен «1», это будет «hello1 one» и т. Д. Если параметр равен «2», будет напечатано содержимое той же строки после «2». –

ответ

2

Из того, что вы говорите, вы ищете линии, помеченные номером в начале строки. В этом случае вы хотите что-то, где вы можете прочитать строку с тегом префиксом

bool readTaggedLine(char* filename, char* tag, char* result) 
{ 
    FILE *f; 
    f = fopen(filename, "r"); 
    if(f == NULL) return false; 
    while(fgets(result, 1024, f)) 
    { 
     if(strncmp(tag, result, strlen(tag))==0) 
     { 
      strcpy(result, result+strlen(tag)+1); 
      return true; 
     } 
    } 
    return false; 
} 

затем использовать его как

char result[3000]; 
if(readTaggedLine("blah.txt", "3", result)) 
{ 
    printf("%s\r\n", result); 
} 
else 
{ 
    printf("Could not find the desired line\r\n"); 
} 
+0

Это действительно умно, я даже не думал о включении булевой функции. Кроме того, использование strncmp(), как и вы, намного проще. Спасибо! –

+0

Мне очень нравится проходить мимо. Особенно с распределением памяти. Я предпочитаю передавать буферы, поэтому вы можете использовать его с malloc или статической памятью по своему усмотрению. –

0

Вы можете использовать дополнительное значение, чтобы помочь вам записать, сколько строк вы прочитали. Затем в цикле while сравнивайте значение с вашим входным значением, если они равны, выведите buffer.

1

Я хотел бы попробовать следующее.

Подход 1:

Read and throw away (n - 1) lines 
// Consider using readline(), see reference below 
line = readline() // one more time 
return line 

Подход 2:

Read block by block and count carriage-return characters (e.g. '\n'). 
Keep reading and throwing away for the first (n - 1) '\n's 
Read characters till next '\n' and accumulate them into line 
return line 

Readline(): Reading one line at a time in C

P.S. Ниже приведено решение оболочки, оно может быть использовано для тестирования программы C.

// Display 42nd line of file foo 
$ head --lines 42 foo | tail -1 
// (head displays lines 1-42, and tail displays the last of them) 
+0

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

+0

Это, но определение проблемы было непонятным :-), я попытался уточнить, задав в разделе комментариев вопрос, но я явно не смог! – Arun

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