Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
Добрый день. Передо мной стоит задача - разбить текст на предложения, попутно определив смещение каждого из них от начала файла. Реализовать это нужно на C++, с которым я почти и не сталкивался. Да и вряд ли когда-нибудь буду использовать. Суть проблемы: Нужно создать функцию, которая строит индекс предложений в текстовом файле. Индекс - это упорядоченная последовательность пар (порядковый номер предложения – смещение от начала файла) для каждого предложения в файле. Как построить этот индекс? Ведь предложение может оканчиваться не только точкой, но и восклицательным знаком (или несколькими), многоточием... Всякие побайтовые функции вернут результат в байтах, а кодировка файлов может быть разной. Это ведь не смещение. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 17:55 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
AlexanderWMЭто ведь не смещение. ftell() - это смещение. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 18:06 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
Ок. Набросал тут маленькую консольную штуку. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Правильно строю индекс? Как в C/С++ делают конкатенацию строк/символов? Мне бы хотелось это оформить в виде функции, где вместе printf("%d-%d\r\n", i, pos) всё бы копировалось в буфер, а потом отдавалось через return ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 18:31 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
AlexanderWMОк. Набросал тут маленькую консольную штуку. Код: plaintext 1. Правильно строю индекс? Как в C/С++ делают конкатенацию строк/символов? Мне бы хотелось это оформить в виде функции, где вместе printf("%d-%d\r\n", i, pos) всё бы копировалось в буфер, а потом отдавалось через returnДвижешься в правильном направлении, но вот эта строка - не верная. с у тебя может хранить только один символ. И операция логического OR пишется не так. А вообще, я бы сделал на основе двух переменных. Если c1 это знак препинания которым может заканчиваться предложение, а c2 это не знак препинания, то c2 это либо начало нового предложения, либо пробелы между предложениями.... И от этого плясать дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 18:45 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
White OwlА вообще, я бы сделал на основе двух переменных. Если c1 это знак препинания которым может заканчиваться предложение, а c2 это не знак препинания, то c2 это либо начало нового предложения, либо пробелы между предложениями.... И от этого плясать дальше. 1). Стоп! Если я буду использовать две переменные - то указатель на текущую позицию в файле "ускачет", когда я буду работать с следующим символом. Или как это можно сделать? 2). А как правильно OR писать? Через ||, как сокращенная дизъюнкция? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 18:57 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
AlexanderWM1). Стоп! Если я буду использовать две переменные - то указатель на текущую позицию в файле "ускачет", когда я буду работать с следующим символом. Или как это можно сделать?Почему указатель ускачет? Указатель сам по себе, переменные сами по себе. Ну поименуй эти две переменные как c_previous и c_current. В c_current читай текущий байтик, а потом (после всей логики) переписывай значение из c_current в c_previous и читай следующий байтик в c_current. И так по кругу пока файл не кончится. AlexanderWM2). А как правильно OR писать? Через ||, как сокращенная дизъюнкция?А при чем здесь сокращенная дизъюнкция? Знание дискретной математики это хорошо конечно, но привыкай к тому что если ты переходишь на новый язык программирования, надо зазубрить новый синтаксис. Все они (ну почти все) используют все те операции и принципы которые ты учил на лекциях по дискретке, но записываются эти операции везде по разному. Просто прими это как данность. И кстати это не только к ЯП относится, к обычным человеческим языкам это тоже относится: возьмешь иностранный учебник тоже напорешься на непривычную запись привычных операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 19:18 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял что вы хотите, то возможно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Я бы вынес в отдельную функцию признаки конца предложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 08:35 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЕсли я правильно понял что вы хотите, то возможно так... Спасибо! Очень похоже на то, что нужно. Но есть вопросы. Как поступить с самым первым предложением? Как всё-таки засунуть в буфер содержимое файла? Через fcansf? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 11:12 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
С файлом разобрался. Осталось две вещи. Разобраться с первым предложением и типизацией. В программе везде используется TCHAR, а у меня просто char Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 15:00 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
AlexanderWMС файлом разобрался. Осталось две вещи. Разобраться с первым предложением и типизацией. Такой вариантик, используется POSIX, можно заменить дубляжом их boost::interprocess, считает файлы с кодировками ASCII и utf-8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 15:10 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
smaldТакой вариантик, используется POSIX, можно заменить дубляжом их boost::interprocess, считает файлы с кодировками ASCII и utf-8. Спасибо. Попробую запустить и разобраться. Но лишь для собственного развития. Текущая задача - часть более крупной задачи на взаимосвязь DLL и WinAPI. Поэтому в глубину языка лезть не хочу, так стиль простого C мне ближе, а все возможности C++ хоть и можно использовать, но это перебор. Тем более, что С++ для меня "проходной". Мне нужно лишь решить на нём несколько задачек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 15:47 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
Поторопился выкинуть, вместо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. пишем Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 15:49 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
AlexanderWMСпасибо. Попробую запустить и разобраться. Но лишь для собственного развития. Текущая задача - часть более крупной задачи на взаимосвязь DLL и WinAPI. Поэтому в глубину языка лезть не хочу, так стиль простого C мне ближе, а все возможности C++ хоть и можно использовать, но это перебор. Тем более, что С++ для меня "проходной". Мне нужно лишь решить на нём несколько задачек. Что-то не понимаю, Вам оно для сдачи какой зачётки нужно? Или Вы на работе? Если последнее, то не понятно, чем там занимаетесь. Стиль простого Си устарел, если не собираетесь пилить в ядро, то штудируйте стандарт C++ от корки до корки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 15:53 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
smaldAlexanderWMСпасибо. Попробую запустить и разобраться. Но лишь для собственного развития. Текущая задача - часть более крупной задачи на взаимосвязь DLL и WinAPI. Поэтому в глубину языка лезть не хочу, так стиль простого C мне ближе, а все возможности C++ хоть и можно использовать, но это перебор. Тем более, что С++ для меня "проходной". Мне нужно лишь решить на нём несколько задачек. Что-то не понимаю, Вам оно для сдачи какой зачётки нужно? Или Вы на работе? Если последнее, то не понятно, чем там занимаетесь. Стиль простого Си устарел, если не собираетесь пилить в ядро, то штудируйте стандарт C++ от корки до корки. Делаю задачу по программированию на использование DLL в WinAPI, а конкретнее - нужно создать динамически компонуемую библиотеку, которая будет экспортировать функции (в количестве не менее 3-х), обеспечивающие удобное решение задачи. Задачу я озвучил - построить индекс текстового файла. С библиотеками разобрался, с экспортом функций тоже. Главное - сама задача. Абстрагируясь от всего лишнего - мне нужна функция TCHAR *GetIndex(TCHAR *path), которая принимает путь к текстовому файлу, и возвращает индекс в TCHAR *. Помогите, пожалуйста, исправить нижеследующий код, чтобы он принимал в качестве единственного параметра путь к файлу, а возвращал индекс (строки с инфой разделённые \r\n). И моему счастью не будет предела :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 16:18 |
|
||
|
Определить границы предложений в файле
|
|||
|---|---|---|---|
|
#18+
AlexanderWMДелаю задачу по программированию на использование DLL в WinAPI, а конкретнее - нужно создать динамически компонуемую библиотеку, которая будет экспортировать функции (в количестве не менее 3-х), обеспечивающие удобное решение задачи. Задачу я озвучил - построить индекс текстового файла. С библиотеками разобрался, с экспортом функций тоже. Главное - сама задача. Абстрагируясь от всего лишнего - мне нужна функция TCHAR *GetIndex(TCHAR *path), которая принимает путь к текстовому файлу, и возвращает индекс в TCHAR *. Помогите, пожалуйста, исправить нижеследующий код, чтобы он принимал в качестве единственного параметра путь к файлу, а возвращал индекс (строки с инфой разделённые \r\n). Сумбур. Индекс чего? Строк в файле много. Или требуется выкусить строку, соответствующую регулярному шаблону? Тогда указатель на строку-шаблон не вижу в сигнатуре GetIndex(TCHAR *path). Выше привёл кодик, который формирует массив с структурами, каждая из которых содержит смещение начала какого-то предложения в байтах от начала файла, и порядковый номер предложения. предложения разделяются символами \n, \r, !,?, . , ; : Единственное, это тамошние POSIX функции нужно перевести на их аналоги в windows. Без POSIX, будет так, и без mmap тормозить на очень больших файлах. Как вариант задействовать boost::interprocess::file_mapping. Не знаю, какой аналог mmap в WinAPI, никогда с ним не работал и не интересовался. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 18:06 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38674487&tid=2019409]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 300ms |
| total: | 455ms |

| 0 / 0 |
