Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Открытие документа *.DOC


Автор: sigizmynd 13.8.2010, 15:31
Здравствуйте.

Вопрос такой.
Язык С и С++
прекрасно работают с текстом в формате *.txt, но у меня возникла необходимость просмотреть программными средствами файл формата *.doc. 
fd = open("s.doc", O_RDWR);
    if(fd < 0)
    {
        perror("Can't open file");
        exit(EXIT_FAILURE);
    }
    char buff[10];
    ssize_t nread;
    int i;
    nread = read(fd, buff, (sizeof(buff)));
    for(i = 0; i < 10; i++)
    {
        printf("\n%d\n",buff[i]);
    }
но таким образом на экран выводятся очень странные цифры
-48
-49
17
-32
-95
-79
26
-31
0
0

Самое интересное, что в этом самом файле записано одно единственное число 1.
в ASCII кодировке 1 имеет 31 номер
среди первых чисел такого числа и близко нету.
короче, итого, у меня вопрос,существует ли какая-нибудь библиотека/функция (не готовая программа типа doc2txt), которая могла бы разбирать формат doc и с помощью которой можно было бы прочитать данные из этого документа.
Не буду против различных предложений в ASMe поскольку немного его знаю и смогу запрограммировать.
Буду рад за любую информацию

Автор: djamshud 13.8.2010, 15:40
sigizmynd, в доке хранится не столько текста, сколько информации о его разметке.

См http://directory.fsf.org/project/catdoc/.

Автор: xvr 13.8.2010, 18:13
Формат doc файла есть на сайте MS, но разбирать его - занятие не для слабонервных   smile 

Автор: sigizmynd 18.8.2010, 15:20
нашел способ сделать это гораздо проще, без каких-либо заморочек.
есть такая замечательная команда, называется cp
вот что я сделал:
cp file.doc file.txt
и, не поверите, текст стал адекватно восприниматься.
только пришлось для взаимодействия с русским текстом дописать кусочек:
char* rus(char* st)
{
         char* p = st;

        while (*p < 0)
        {
                if (*p >= 192)
                if (*p <= 239)
                        *p -= 64;
                else
                        *p -= 16;
                p++;
        }
         return st;
}
Спасибо, всем удачи

Автор: boostcoder 18.8.2010, 15:21
Цитата(sigizmynd @  18.8.2010,  15:20 Найти цитируемый пост)
и, не поверите

не верю.

Автор: xvr 19.8.2010, 11:09
Цитата(sigizmynd @  18.8.2010,  15:20 Найти цитируемый пост)
вот что я сделал:
cp file.doc file.txt
и, не поверите, текст стал адекватно восприниматься.
Это сильно, это 5.  smile Вот все бы проблемы так решались  smile 

Цитата(sigizmynd @  18.8.2010,  15:20 Найти цитируемый пост)
только пришлось для взаимодействия с русским текстом дописать кусочек:
Похоже у вас обычный текстовый файл, только в другой кодировке.
PS. 'Кусочек' кстати неправильный


Автор: sigizmynd 20.8.2010, 11:09
мда, сор, затупился я немножко.
проблема так и не решилась.
то что писалось выше, оно действительно работает, но только когда *.doc файл находится в нормальной кодировке. тогда команда cp работает. а так да, действительно копирование происходит, но текстовый документ не открывается потом.
Вообще суть задачи в следующем:
Есть *.doc документ, в нем есть некоторый текст, который необходимо заменить на текст, полученный из командной строки.
целый день колупался, так формат doc открыть не удалось.
Пришлось работать с текстовым документом.
Поступил немного проще: написал небольшой скрипт, который заменяет слова в текстовом файле.
в результате - все работает, но работает только с текстовым файлом.
а мне необходимо, чтобы это был файл в формате doc, чтобы чтение/запись происходило с файлом этого формата.
Читал много на эту тему, увидел, что возможно взаимодействие через OLE объекты. Однако, у меня Ubuntu и я вообще без понятия можно ли их каким-то макаром подключить.
также прочитал, что возможно такое открытие/чтение/запись через Java. 
К сожалению, сейчас не смогу проверить, так как не установлена Java-машина.
Может кто-нибудь знает, можно ли из-под командной строки открыть doc файл.
Или может быть команду, которая могла бы читать/записывать в doc файл.
Буду рад помощи.

P.S. извините, если что-то вышеизложенное неправильно И та функция перевода русских символов работает адекватно.
Приведи пример, когда она сработает неадекватно.
Спасибо

Автор: xvr 20.8.2010, 14:04
Цитата(sigizmynd @  20.8.2010,  11:09 Найти цитируемый пост)
а мне необходимо, чтобы это был файл в формате doc, чтобы чтение/запись происходило с файлом этого формата.
Читал много на эту тему, увидел, что возможно взаимодействие через OLE объекты.
Угу. Судя по уровню ваших вопросов вам самому это не осилить  smile Если есть желание попробовать, то смотрите сюда - http://download.microsoft.com/download/2/4/8/24862317-78F0-4C4B-B355-C7B2C1D997DB/OfficeFileFormatsProtocols.zip

Цитата(sigizmynd @  20.8.2010,  11:09 Найти цитируемый пост)
И та функция перевода русских символов работает адекватно.
Приведи пример, когда она сработает неадекватно.
Всегда. Если вы привели код как он есть, то ваша функция ничего не делает

Посмотрите на условие в while и во внутренних if'ах - они взаимоисключающие. Не может число меньшее нуля быть больше 192

Еще вариант - поставьте Wine, в нем запустите Word и в нем сделайте вашу замену (можно автоматически через скрипты)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)