2016-04-21 3 views
1

У меня есть текстовый файл, который выглядит следующим образом:Использование fgets && sscanf для чтения из массива

C M 2/1/2015 18280 "2107070770" 
C U 2/1/2015 18300 "2107070770" 

текстовый файл имеет несколько строк. Я пытаюсь сохранить каждую строку в массив строк, а затем сохранить каждое значение в переменные, с которыми хочу работать. (я открываю FOPEN Удачно файл)

хранить каждую строку следующим образом:

char line[50]; 
char *lines[40]; 
char *eof ; 
int i ; 
while((eof = fgets(line, 50, in)) != NULL) 
{ 
    lines[i] = strdup(eof); 
    i++; 
} 

Затем я пытаюсь сохранить каждое значение в переменные со следующим образом:

for(j = 0; j <= 39 ; j++) 
{ 
    sscanf(lines[j], "%c %c %d/%d/%d %d %s", &(operation), &(destination), &(day) , &(month) , &(year) , &(name)) ;  

    /*printf("%s\n", lines[j]);*/ 
} 

Итак, я могу работать на каждой линии отдельно. Мой код хранит каждую строку в массиве успешно, но после , добавляя функцию sscanf, она перестает работать без вывода. Что я сделал не так?

+1

'while ((eof = fgets (строка, 50, in))! = NULL)' -> 'while (fgets (line, 50, in))' и с последним аргументом 'scanf' вам не нужно передавать адрес, потому что' name' уже (или распадается) указатель. –

+0

'i' здесь не инициализируется. Автоматические переменные по умолчанию не инициализируются. – sjsam

+0

Семь спецификаторов преобразования. Шесть переменных.Неопределенное поведение. Вы умираете. ;-) – DevSolar

ответ

3

Для линии

C U 2/1/2015 18300 "2107070770" 

После 2015 года, вы теряете целое число 18300. У вас есть спецификатор формата в строке формата, но не соответствующего переменный для его хранения.

после операции, назначения, день, месяц, год, missing_variable, имя

//so the right one will be 
// assuming name is a char* 

int my_int = 0; 
for(j = 0; j <= 39 ; j++) 
{ 
    sscanf(lines[j], "%c %c %d/%d/%d %d %s", 
    &(operation), &(destination), &(day) , &(month) , &(year), 
    &(my_int), name) ;  

    /*printf("%s\n", lines[j]);*/ 
} 
+0

спасибо большое! есть ли способ игнорировать кавычки \ "? –

+0

Что вам может понадобиться для выделения с помощью специальной функции. – padfoot

0

Начните с проверки вашего дескриптора файла успешно указывает на файл

if(in==NULL) 
    exit(-1); // Hope this is already in the code. 

Изменение

int i ; 

до

int i=0; // automatic variables are not initialized by default 

С ISO/IEC 9899: 201x 6.7.9-> 10

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

Как какой-то указатель, у вас есть недостающая переменная в sscanf. Если вы хотите, чтобы с оторвал весь материал после age, скажем 18280 "2107070770" в строку name вы можете сделать это нравится:

sscanf(lines[j], "%c %c %d/%d/%d %d %[^\t\n]", 
    &(operation), &(destination), &(day) , &(month) , &(year), 
    &(my_int), name) ; 

Кроме того, как кто-то указал name затухает на указатель, так что вам не нужно передайте его как &name

+0

спасибо alot mate !! есть ли способ игнорировать кавычки \"? –

+0

Измените '% [^ \ t \ n]' на '% [^" \ t \ n] '. Вы можете видеть, что я добавил отметку кавычки. Это называется сканированием и с использованием'^'в начале мы скажем scanf отказаться от последующих символов. Если вы не используете '^', значит, это означает только чтение из набора символов, например, '[a-zA-Z]' читает только символы в диапазон – sjsam

+0

См. [scansets in C] (http://www.geeksforgeeks.org/scansets-in-c/) – sjsam

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