Чтение из файла и сохранение в C
Я пытаюсь прочитать в текстовом файле строку, за которой следует число, а затем сохранить его содержимое. До сих пор я могу заставить его распечатать только строку (или только int, или оба), если он правильно отформатирован. Как я могу пропустить пустые или неправильно отформатированные строки (которые в настоящее время дублируют предыдущую строку), а также сохранить результаты?
#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;
}
Пример текстового файла
Холод 5 10 пламен Собачка 4 Пламя 11 Холод 6
3 ответа
Решение
Вероятное решение вашей проблемы в коде ниже.
#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;
}
Вы можете использовать функцию fscanf. Пустое пространство в строке формата позволяет игнорировать пробелы, символы табуляции или переносы строк.
Вместо
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);
}
сделать это (это удалит все пробелы и \n и просто вытащит токены)
while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL)
{
char* token = strtok(input, " \n");
while ( token != NULL )
{
printf( "%s", token );
token = strtok(NULL, " \n");
}
}