Читать строку файла, которая изменяется, но структура строки известна - PullRequest
1 голос
/ 15 мая 2011

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

Пример строки: 1 Andre 2 0 5 13 05 2011 4 13 05 2011

«1» представляет идентификатор пользователя

«Андре» представляет имя, связанное с идентификатором

'2 0' подразделяется: '2' представляет, сколько фильмов пользователь забрал домой, а '0' представляет, сколько бронирований фильмов имеет пользователь.

Пока что строка следует шаблону% d% s% d% d, и они могут быть сохранены в переменных, которые я хочу.

Теперь самое сложное. В зависимости от части '2 0', программа знает, что должна прочитать шаблон% d% d% d% d ('5 13 05 2011' и '4 13 05 2011' - представляют даты фильмов, взятых домой) 2 раза а также программа знает, что после двухкратного чтения предыдущего паттерна она знает, что мне больше ничего не нужно читать из-за нулевой части в '2 0'.

Пример строки с дополнительными данными: 1 Andre 2 1 5 13 05 2011 4 13 05 2011 7 14 05 2011

'2 1'

Часть '2' сообщает программе, что в этой строке следует прочитать '5 13 05 2011' и '4 13 05 2011' в variable_one [i] [4] (пример)

Часть '1' сообщает программе, что в этой строке она должна прочитать '7 14 05 2011' в variable_two [i] [4] (пример)

Я использую fscanf(file, "%d %s %d %d", &id[i],&nomes[i],&livros_num[i][0],&livros_num[i][1]); для чтения '1 Andre 2 0', но как я могу прочитать остальную часть строки в соответствии с '2 0'?

Ответы [ 5 ]

1 голос
/ 15 мая 2011

Вы можете использовать fscanf . Вот пример:

int int1;
char char_buf[BUF_SIZE];
fscanf ( file_stream, "%d%s", &int1, char_buf);
0 голосов
/ 15 мая 2011

Что ж, когда вы читаете '2 0', вы получаете две части информации: сколько раз вам нужно сделать цикл для дат фильмов, взятых домой, и сколько раз вам нужно сделать цикл для чтения всех резервирований.

int i;
int num_movies_taken, num_movies_reserved;

// read all the dates of the movies taken home
num_movies_taken = livros_num[i][0];
for (i = 0; i < num_movies_taken; i++)
{
    fscanf("%d %d %d %d", ...);
}

// read all the reservations
num_movies_reserved = livros_num[i][1];
for (i = 0; i < num_movies_reserved; i++)
{
    fscanf("%d %d %d %d", ...);
}
0 голосов
/ 15 мая 2011

Как насчет

int j;
fscanf(file, "%d %s %d %d", &id[i],&nomes[i],&livros_num[i][0],&livros_num[i][1]);
for (j=0;j<livros_num[i][0];++j)
{
    fscanf(file,"%d %d %d %d",&variable_one[0],&variable_one[1],&variable_one[2],&variable_one[3]);
}

и т.д.

0 голосов
/ 15 мая 2011
fgets(buf,sizeof(buf),f)

p = strtok (buf," ");
p1 = strtok (0," ");
p2 = strtok (0," "); 

p3 = strtok (0," "); 

n1 = atoi(p1);
n2=  atoi(p2);

i=0;
while(n1--)
{
  sscanf(p3,"%d %d %d %d", &v1[i],&v2[i],&v3[i],&v4[i] );
  strok(0," ");
  strok(0," ");
  strok(0," ");
  p3 =   strok(0," ");
  i++;

}

i=0;
while(n2--)
{
  sscanf(p3,"%d %d %d %d", &v2[i],&v2[i],&v2[i],&v2[i] );
  strok(0," ");
  strok(0," ");
  strok(0," ");
  p3 =   strok(0," ");
  i++;

}
0 голосов
/ 15 мая 2011

После вашего первого вызова fscanf вам нужно выполнить цикл в зависимости от переменных, которые вы прочитали. Похоже, вы уже поняли, что int, которые вы прочитали при первом вызове, определяют количество дополнительных операций чтения, которые вам нужны в строке.

int i;
for ( i=0; i< livros_num[i][0]; i++ ) {
    int something, day, month, year; // 'something' is unclear to me in your code
    fscanf( file, "%d %d %d %d", &something, &day, &month, &year );
    // store these variables wherever
}

// same procedure for second number
for ( i=0; i< livros_num[i][1]; i++ ) {
    int something, day, month, year; // 'something' is unclear to me in your code
    fscanf( file, "%d %d %d %d", &something, &day, &month, &year );
    // store these variables wherever
}
fscanf( file, "%s\n" ); // I'm NOT sure if this is nessecary, to move the file to the next line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...