Ввод файла в C - PullRequest
       18

Ввод файла в C

0 голосов
/ 07 сентября 2018

Я хочу ввести следующие строки из файла ("input.txt"):

a 1,2,3,4,5,6
b 1,8

(то есть символ, за которым следует пробел, а затем массив, разделенный запятой)

Я пробовал следующий код:

int main(int argc, char *argv[])
{
    std::vector<int> arr;
    FILE *file = fopen("input.txt","r");

    while(!feof(file))
    {
        for(int i = 0; i < arr.size(); i++)
        {
            fscanf(file,"%s %d,",str,&arr[i]);
        }
    }
 }

Дайте мне знать правильный способ сделать это, так как он показывает значения мусора

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Это должен быть C или C ++? Вы используете тип данных C ++ (std::vector), но подпрограммы ввода / вывода C. Вы также не указали тип для str.

Предполагая, что вы хотите использовать подпрограммы ввода / вывода C, вы можете сделать что-то вроде этого:

char str[SOME_LENGTH+1]; // where SOME_LENGTH is how big you expect the string to be

/**
 * Get the string at the beginning of the line; scanf should return 1
 * on a successful read.
 */
while ( scanf( "%s", str ) == 1 ) 
{
  size_t i = 0;
  /**
   * Read the sequence of integers and commas.  We consume the character
   * immediately following the integer, but don't assign it (the %*c
   * specifier).  So we'll consume the comma or newline following
   * the integer.  Since a letter isn't part of a decimal integer,
   * we'll stop scanning at the beginning of the next line.
   */
  while( scanf( "%d%*c", &arr[i++] ) == 1 )
    ; // empty loop
}

Примечание: это предполагает, что ваш ввод ведет себя хорошо, и между числом и следующей запятой нет пробелов (т. Е. У вас нет что-то вроде 1, 2 , 3).

0 голосов
/ 07 сентября 2018

Прежде всего, Маниша, вы наблюдаете необычное поведение кода, потому что цикл while, который вы использовали, никогда не останавливается. Позвольте мне рассказать вам, почему очень просто. Условие остановки, указанное вами в цикле while, т. Е. feof() указывает, пытался ли кто-нибудь прочитать после конца файла. Но вы никогда не сможете прочитать PAST в конце файла, что означает, что цикл while никогда не остановится.

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

while (fgets(line, sizeof(line), file)) {
/* note that fgets doesn't strip the terminating \n(new line character) */
...
}
if (ferror(file)) {
    /* IO failure */
} else if (feof(file)) {
    /* format error (not possible with fgets, but would be with fscanf) or end of file */
} else {
    /* format error (not possible with fgets, but would be with fscanf) */
}
...