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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами, Определение конца файла 
V
    Опции темы
froex
  Дата 2.7.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сначала код:
Код

#include <stdio.h>

int main(int argc, char* argv[])
{
    FILE *fo, *fi;
    int s;
    bool b=0;
    fi=fopen(argv[1],"rb");
    fo=fopen(argv[2],"wb");
    while((s=getc(fi))!=EOF)
        putc(s, fo);
    fclose(fi);
    fclose(fo);
    return 0;
}

Открываются два бинарных файла - один для чтения, другой для записи. Происходит побайтовое копирование из одного в другой. Если то же самое производить для текстовых файлов (заменить параметр rb и wb на rt и wt), то может не правильно определяться конец файла. Я рассматривал этот пример на файле в 295Кб, а результатом для текстового режима оказался только файл в 5Кб. Это первый вопрос: как для текстового режима определить конец файла?
Следующие заморочки наступают, когда один файл указан как текстовый, а другой как бинарный. Допустим, что считываем с бинарного файла, а пишем в текстовый. Тогда из бинарного файла все символы '\n' заменятся на текстовые '\r\n' - я так понимаю? т.к. судя по мои опытам - размер файлика увеличивается. Второй вопрос: что еще может преобразовываться, помимо сивола конца строки '\n'? И будут ли преобразования, если считывать из бинарного файла, а писать в текстовый? (этот случай не могу проверить из-за неправильного определения конца файла).

В коде можно заметить, что считываемый символ (s) объявлен как целое число - я вычитал, что конец файла может определяться, как (-1), что недопустимо при типе char. Судя по документации - некоторые функции из stdio сравнивают позицию курсора и длину файла. Какие именно?
PM MAIL ICQ   Вверх
andrew_121
Дата 2.7.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



froex, Надо так:
Код

#include <stdio.h>
int main(int argc, char* argv[])
{
    FILE *fo, *fi;
    int s;
    bool b=0;
    fi=fopen(argv[1],"rb");
    fo=fopen(argv[2],"wb");
    while( !feof(fi) ) {
        putc(getc(fi), fo);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}


Добавлено через 32 секунды
Но нужно блоками копировать.

Добавлено через 2 минуты и 1 секунду
Мне никогда не приходило в голову читать бинарный файл этими функциями. smile

Добавлено через 5 минут и 16 секунд
У тебя такое кол-во вопросов, только из-за того, что эти функции для этого не предназначены!
Попробуй написать свою версию. Вдруг так проще.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
froex
Дата 2.7.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для текстового режима не работает. Конец файла определяется неправильно.
PM MAIL ICQ   Вверх
andrew_121
Дата 2.7.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(froex @  2.7.2009,  18:56 Найти цитируемый пост)
Для текстового режима не работает. Конец файла определяется неправильно. 

Странно smile 
У меня работает. Все правильно определяется.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
froex
Дата 2.7.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ты небось на скорую руку сам файлик напечатал. У меня же вместо такого вот текста берется сохраненный дамп памяти открытой программы - там могут быть какие угодно символы.
PM MAIL ICQ   Вверх
andrew_121
Дата 2.7.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



froex, Ты не понимаешь о чем говоришь.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
froex
Дата 2.7.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если ты не в теме - то чего говоришь? Я изначально сказал, что проблема для текстового режима. Для файла как для бинарного все отлично срабатывает. При считывании как текстового - конец файла наступает почти в самом начале. Я не знаю почему.
PM MAIL ICQ   Вверх
froex
Дата 2.7.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Выкладываю обрабатываемый файл. Моя прога выдает только 5Кб от этого файла. Если обрабатывать как бинарный файл, то проблем нет.

Это сообщение отредактировал(а) froex - 2.7.2009, 20:14

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  input.dmp 292,00 Kb
PM MAIL ICQ   Вверх
jonie
Дата 2.7.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



froex так он собственно содержит символы, которые не принадлежат допустимому алфавиту для текстовых файлов, вот оно и останавливается. Ctrl+Z вроде бы "конец файла"...
А чем плохо бинарное общение с файлом?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
froex
Дата 2.7.2009, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ничего плохого нет. Просто я хочу узнать, есть ли решения для текстовых файлов поиска истинного конца файла.
PM MAIL ICQ   Вверх
Earnest
Дата 3.7.2009, 08:00 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Текстовый файл - это файл, не содержищий "нетекстовых" символов, а вовсе не открытый в текстовом режиме. Ты же хочешь узнать, можно ли нетекстовый файл читать как текст. Нельзя.


--------------------
...
PM   Вверх
andrew_121
Дата 3.7.2009, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Earnest, Как я ни пытался вдолбить это, в пустую.

Добавлено через 2 минуты и 28 секунд
Цитата(froex @  2.7.2009,  23:02 Найти цитируемый пост)
Просто я хочу узнать, есть ли решения для текстовых файлов поиска истинного конца файла.

Для любого файла, концом файла является тот момент, когда позиция чтения равняется размеру файла.

Добавлено через 6 минут и 23 секунды
А определение конца файла по какому-то символу, не верно!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 3.7.2009, 08:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(andrew_121 @  3.7.2009,  08:18 Найти цитируемый пост)
А определение конца файла по какому-то символу, не верно!

я раньше конец текстового файла определял с помощью символа '\032'. но мне это решение никогда не нравилось...
сейчас перешёл на istream_iterator! smile
Код

string text;
ifstream in("file.txt");
getline(in, text, '\032'); // считать файл целиком


Код

string text;
copy(istream_iterator<char>(in >> noskipws), istream_iterator<char>(), back_inserter(text));




--------------------
PM MAIL   Вверх
DrHex
Дата 4.7.2009, 19:08 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Что это за техника подсчета символов в файле? Перебрать все символы? А если файл метро 200 будет? 

Получай размер файла и всё.....
--------------------
google.com и это все.
PM MAIL   Вверх
zim22
Дата 4.7.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(DrHex @  4.7.2009,  19:08 Найти цитируемый пост)
 А если файл метро 200 будет? 

сейчас видео-файлы и по 50 гиг есть smile blue-ray 


--------------------
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.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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