Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление из строки NULL-идентификатора, или выделение подстроки 
V
    Опции темы
Фишка
Дата 17.10.2010, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.9.2010

Репутация: нет
Всего: нет



Цель: открыть файл по строке, введённой с клавиатуры
Проблема: в имени файла могут быть пробелы, а scanf("%s", sSource); считывает строку до первого пробела (со слов педагога; ох, не удосужилась сама проверить)

Для решения проблемы предлагается использовать fscanf(), но в полученной строке последний символ "\0", поэтому при передаче этой строки в fopen() возникает ошибка (нет файла с именем, заканчивающимся на "\0"). Помогите, пожалуйста, как-нибудь удалить NULL-идентификатор из строки или выделить подстроку без него...

Вот кусочек кода на Си:

Код

FILE *OpenFile(void)
{
     FILE *fp;
     char sSource[256];

     printf("Введите имя файла: ");

     if ( fgets(sSource, sizeof(sSource), stdin) != NULL )
     {
          fp = fopen(sSource, "r");
          if (fp == NULL)
               printf("Невозможно открыть указанный файл\n");
     }
     else
     {
          printf("Перезапустите программу и попробуйте ввести имя покороче\n");
          fp = NULL;
     }

     return (fp);
}


PM MAIL   Вверх
EgorTheBlade
Дата 17.10.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 5.12.2009

Репутация: нет
Всего: -1



getline() -читает с пробелами. fscanf ()  \0 видет? -не знал. Попробуйте filesize-1 тогда.
PM MAIL Skype   Вверх
mes
Дата 17.10.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Фишка @  17.10.2010,  13:00 Найти цитируемый пост)
нет файла с именем, заканчивающимся на "\0"). Помогите, пожалуйста, как-нибудь удалить NULL-идентификатор из строки или выделить подстроку без него...

и как же fopen узнает конец передаваемой строки ?
си-строки не могу быть не нуль терминированные, в противном случае это просто набор байт.. 
ошибку ищете в другом месте.. 

для начал попробуйте вывести ту строку, которую вы передаете в fopen (); 
smile



--------------------
PM MAIL WWW   Вверх
Фишка
Дата 17.10.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.9.2010

Репутация: нет
Всего: нет



EgorTheBlade, 
насколько я поняла, getline() - функция C++, нигде не нашла её описания для C.

mes, 
Цитата(mes @  17.10.2010,  14:34 Найти цитируемый пост)
си-строки не могу быть не нуль терминированные, в противном случае это просто набор байт.. 

угу, я тоже так думала
но вот описание функции gets()
Цитата
Считывает байты из потока  stdin в строку  str  до тех пор,  пока не встретит  признак новой строки или конца файла. Признак "новая строка"(newline) не записывается в строку. Строка завершается 0. Строка должна быть достаточно большой, чтобы вместить результат.

при замене fgets() на gets() всё прекрасно работает, только компилятор ругается, мол, опасная функция, которую не следует использовать.

Цитата(mes @  17.10.2010,  14:34 Найти цитируемый пост)
для начал попробуйте вывести ту строку, которую вы передаете в fopen (); 

выводила, всё корректно во всех способах считывания строки

Это сообщение отредактировал(а) Фишка - 17.10.2010, 19:04
PM MAIL   Вверх
mes
Дата 17.10.2010, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Фишка @  17.10.2010,  18:04 Найти цитируемый пост)
при замене fgets() на gets() всё прекрасно работает, только компилятор ругается, мол, опасная функция, которую не следует использовать.

и при чем тут нуль-терминатор ?
описание fgets,  я надеюсь, Вы тоже прочитали.. и там тоже ставиться нуль в конце строки..

а отличаются вот этим :
Цитата

 First, the ending newline character is not included with gets while with fgets it is.


Добавлено через 2 минуты и 16 секунд
Цитата(Фишка @  17.10.2010,  18:04 Найти цитируемый пост)
выводила, всё корректно во всех способах считывания строки

значит плохо сравнивали.. если как вы говоруте замена на gets помогает, значит скорей всего у Вас лишним является перевод строки.. 
а его заметить при выводе можно )) (если конечно выводить не только строчку, а какие нибудь ориентиры )
smile



--------------------
PM MAIL WWW   Вверх
xvr
Дата 18.10.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Фишка @  17.10.2010,  14:00 Найти цитируемый пост)
Для решения проблемы предлагается использовать fscanf()

Цитата(Фишка @  17.10.2010,  14:00 Найти цитируемый пост)
но в полученной строке последний символ "\0"

Цитата(Фишка @  17.10.2010,  14:00 Найти цитируемый пост)
if ( fgets(sSource, sizeof(sSource), stdin) != NULL )

"Все перепуталось в доме Облонских"  smile 

У вас не fscanf, а fgets. И не "\0", а "\n". 
Удалить можно так: strtok(sSource,"\n");
PM MAIL   Вверх
Фишка
Дата 19.10.2010, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.9.2010

Репутация: нет
Всего: нет



xvr, 
даааа, запуталось)
описалась, правильно fgets() )
не знала, правильно '\n'

убирается, оказывается, присваиванием последнему (тот который '\n') элементу значение '\0'

всё равно всем спасибо) сдала)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.