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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fstream, Сижу и туплю :) 
:(
    Опции темы
kernel_mode
Дата 8.8.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот кусок кода:
Код

ifstream f(argv[2]);
    if (!f) {
        cout<<"Unable to open file\n";
        return -1;
    }

    int fsize = 0;
    char ch;
    while (f.get(ch))
        fsize++;
    f.close();

    char *BFcode = (char *)malloc(fsize * sizeof(char));
    f.open(argv[2]);
    if (!f) {
        cout<<"Unable to open file\n";
        return -1;
    }
    int i = 0;
    while(f.get(ch)) {
        cout<<ch;
        BFcode[i] = ch;
        i++;
    }
    f.close();

Первая проверка проходит нормально, вычисляю размер файла, закрываю поток. Далее открываю его снова, но второй раз условие не выполняется, хотя вроде должно...
PM MAIL   Вверх
Void
Дата 8.8.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Не вижу причин, по которым это могло бы произойти, код отрабатывает нормально. Но, тем не менее, есть способ сделать это попроще.
Узнать размер файла можно так:
Код
f.seekg(0, ios_base::end);
int fsize = f.tellg();
f.seekg(0, ios_base::beg); // вернуть позицию

sizeof(char) == 1 по определению. malloc, единообразия ради, стоит заменить на new, а то и на vector<char>.
Если не интересуют нюансы с текстовым режимом ('\n' <-> '\r\n' и т.п.), то прочитать файл можно одним махом:
Код
f.read(buffer, size);



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
kernel_mode
Дата 8.8.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ещё вопрос: что за кучка аскишных символов в конце некоторых файлов, причём в каждом в разных количествах.
=====
Два месяца без си и вот такие вопросы возникают... :(
PM MAIL   Вверх
Void
Дата 8.8.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Ничего не понятно. Что за файлы? Что за символы?


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
kernel_mode
Дата 8.8.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Считал я текстовый файл и вывел его на экран, а в конце неопределённое число символов,числящихся в таблице носки smile
Типа этого:
Hello!¤¤¤¤♫Кnv▌▌
PM MAIL   Вверх
Xenon
Дата 8.8.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



kernel_mode, Вероятно в конце массива символов забыл поставить признак конца строки '\0', чтобы этот массив символов в полной мере можно было называть СИшной строкой.
А вообще быстро прочитать весь файл можно так:
Код

std::ifstream file("...");
std::string str;
std::ostringstream ostr;
ostr << file.rdbuf();
str = ostr.str();    
std::cout << str;

Ну либо так если уж сильно массив char`ов нужен:
Код

std::ifstream file("d:\\str.txt");
int file_size = file.seekg(0, std::ios::end).tellg();
file.seekg(0, std::ios::beg);
char* arr = new char[file_size + 1];
arr[file_size] = '\0';
std::copy( std::istream_iterator<char>(file), std::istream_iterator<char>(), arr );
std::cout << arr;
delete [] arr;



--------------------
user posted image  
PM MAIL   Вверх
kernel_mode
Дата 8.8.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Неа smile. Попробовал, не получилось, да и к тому же, разьве в конце каждой строки в файле не стоит \0?  smile
P.S. Что-то совсем я всё позабывал  smile
[OFFTOP]
Ты случайно не с линуксфорума? smile
[/OFFTOP]

Это сообщение отредактировал(а) kernel_mode - 8.8.2007, 22:54
PM MAIL   Вверх
Xenon
Дата 8.8.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



kernel_mode, Странно. Нет, не стоит '\0'. А код точно тот же, что и был в первом посте?
 smile Да, я бывший админ linuxforum`a. Типа стоял у истоков smile


--------------------
user posted image  
PM MAIL   Вверх
Dov
Дата 9.8.2007, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(kernel_mode @  8.8.2007,  21:42 Найти цитируемый пост)
Считал я текстовый файл и вывел его на экран, а в конце неопределённое число символов

kernel_mode, ты, наверное, читал read`ом, но она 'заточена' для чтения бинарных файлов. Используй get или getline для чтения текстовых файлов.
Ну, что-нить вроде этого:
Код

f.get(BFcode, fsize, '\0');



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
kernel_mode
Дата 9.8.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо smile , первая версия интерпритатора brainfuck'a сделана smile (эт чтобы забытые части си вспомнить)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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