2013-11-14 1 views
0

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

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "list.h" 

#define MAX_LINE_LENGTH 400 

int main() 
{ 
    char input[MAX_LINE_LENGTH]; 
    char name[MAX_LINE_LENGTH]; 
    int number; 

    FILE *fr; 
    fr = fopen ("updates.txt", "r"); 
    if (!fr) 
    return 1; 
    while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL) 
    { 
     /* get a line, up to 200 chars from fr. done if NULL */ 
     sscanf (input, "%s", name); 
     /* convert the string to just a string */ 
     printf ("%s\n", name); 
    } 
    fclose(fr); 
    return 0; 
} 

Пример текстового файл

 
Cold 5 
10 Flames 

Doggy      4 

Flames 11 
Cold 6 
+0

Может кто-нибудь сказать мне, как я мог бы сделать петлю в то время как бы запустить до конца файла? –

ответ

0

Вероятное решение для вашей проблемы в коде ниже.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "list.h" 

#define MAX_LINE_LENGTH 400 

int main() 
{ 
    char input[MAX_LINE_LENGTH]; 
    char name[MAX_LINE_LENGTH]; 
    char namet[MAX_LINE_LENGTH]; 
    int number; 

    FILE *fr; 
    fr = fopen ("updates.txt", "r"); 
    if (!fr) 
    return 1; 
    while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL) 
    { 
     memset(name, 0, MAX_LINE_LENGTH); 
     memset(namet, 0, MAX_LINE_LENGTH); 
     /* get a line, up to 200 chars from fr. done if NULL */ 
     //sscanf (input, "%s %d", name, &number); 
     sscanf (input, "%s %s", name, namet); 

     // TODO: compare here for name shall only contain letters A-Z/a-z 
     // TODO: compare here for namet shall only contain digits 

     // If both above condition true then go ahead 
     number = atoi(namet); 

     if(name[0] != '\0') 
     { 
       /* convert the string to just a string */ 
       printf ("%s %d\n", name, number); 
       //printf ("%s %s\n", name, namet); 
     } 
    } 
    fclose(fr); 
    return 0; 
} 
2

Вы можете использовать функцию fscanf. Пустое пространство в строке форматирования позволяет игнорировать любые пробелы, вкладки или новые строки.

+0

Спасибо. Вот решение для чтения и печати строки: Замените цикл while для while (fscanf (fr, "% s% d", имя и номер) == 2) и закомментируйте sscanf. Спасибо! –

0

Вместо

while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL) 
{ 
    /* get a line, up to 200 chars from fr. done if NULL */ 
    sscanf (input, "%s", name); 
    /* convert the string to just a string */ 
    printf ("%s\n", name); 
} 

сделать это (это удалит все пробелы и \ п и просто вынимают жетоны)

while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL) 
{ 
    char* token = strtok(input, " \n"); 
    while (token != NULL) 
    { 
    printf("%s", token); 
    token = strtok(NULL, " \n"); 
    } 
}