2016-11-23 4 views
0

Я просмотрел некоторые вопросы «FGETS» перед публикацией, и то, что я собрал, это может быть новый символ линии, который вызывает проблему для ввода вручную.Использование Fgets двумя способами

int main (int argc, char *argv[]){ 

    char temp[1000]; 
    FILE *user_file; 

    printf("Starting....\n"); //Used for user visual. 


    if(argc == 2){ //open file 
     user_file = fopen(argv[1],"r"); 
     if(user_file == NULL){ 
      printf("No file was found."); 
      exit(2); 
     }else{ 
      fgets(temp,strlen(temp),user_file); 
     } 
    }else if(argc > 2){ // Will exit if arguments are greater than 2. 
     printf("Maximum args 2.\n"); 
     exit(1); 
    }else{ 
     printf("File was not provided, please enter the text to convert.\n"); //If the user doesnt provide a file allow manual input. 
     fgets(temp,strlen(temp),stdin); 
    } 

    printf("%s\n",temp); 


    return 0; 
}//End main 

Вопросы:

  1. Почему fgets не открывая текстовый файл я предоставить ему на CMD линии, и хранить его в массив темп?

  2. Почему Fgets пропускается в статусе «else», если файл не указан?

  3. Почему печать прерывается в обоих случаях?

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

+0

Ваш 'fopen' выглядит хорошо для меня - вы уверены, что файл существует? Вы используете файловую систему с учетом регистра? – Dai

+0

Извините, я не верю, что да, и да, мой друг, он находится на рабочем столе вместе с моим кодом. @Dai –

+0

Что вы вводите, и какой результат вы видите? –

ответ

0

Ваш код имеет несколько проблем.

Вот первая проблема:

char temp[1000]; 

Ваше объявление буфер не инициализирует содержимое буфера - так что значение каждого значения полукокса будет то, что было в необработанной памяти ранее. В C большинство строк «с нулевым завершением», поэтому наличие завершающего NULL (0 - ноль) важно, иначе вы можете запустить переполнение буфера.

«Лучший» подход к обнуление (нуль-инициализации) массива/буфер, прежде чем использовать его, например, так (в C99):

char temp[1000] = {0}; 

... таким образом temp будет содержать все значения 0 (NULL), поэтому все написанное на нем (при условии, что оно не превышает 999 байт) автоматически будет иметь нулевой ограничитель (хотя fgets будет добавлять значение 0, но не каждая функция в C делает это).

Вторая проблема связана с первой: вы используете выполнения функции строка длины strlen, чтобы получить размер strlen буфера. Это неверно, так как размер буфера фиксирован во время компиляции до 1000. strlen вернет индекс первого значения char (NULL), что является неопределенным поведением в этой точке, потому что вы все равно не инициализировали нулевой буфер (так что он мог бы вернуть 0 сразу же, если исходные исходные данные буфера содержали нуль, или он мог превысить 1000, потому что никогда не было нулевого значения.

...Таким образом, вы должны повторно использовать буферную длину, например, так:

#define TEMP_LENGTH 1000 

char temp[ TEMP_LENGTH ]; 

... 

fgets(temp, TEMP_LENGTH, user_file); 

Наконец, вы делаете ту же ошибку, когда вы звоните fgets(temp, ..., stdin).

+0

Я очень ценю подробное объяснение, я сразу же поработаю над этим. Удивительный вечер, мой друг, и оставайся благословенным. @Dai –

0

Стадия: temp[] неинициализирована, и вы пытаетесь найти strlen(temp). Вы даже не знаете, есть ли в массиве NUL. Попробуйте сделать:

#define MAXLINE 1000 

и изменение ваших вызовов fgets():

fgets(temp, MAXLINE, user_file); 
... 
fgets(temp, MAXLINE, stdin); 
+0

Спасибо, мой друг –

0

Здесь проблема заключается в вашем коде, вместо переданного числового значения во втором аргументе вы передали strlen (temp).

fgets(temp,strlen(temp),user_file); 

правильный путь: -

fgets(temp,1000,user_file); 
Смежные вопросы