{"id":667,"date":"2010-12-27T09:33:16","date_gmt":"2010-12-27T08:33:16","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=667"},"modified":"2010-12-18T09:53:13","modified_gmt":"2010-12-18T08:53:13","slug":"bug-vc-2010-ftell-liefert-negative-werte-wenn-eine-utf-8-datei-mit-ccsunicode-geoeffnet-wird-die-nicht-mit-fseek-funktionieren","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/12\/27\/bug-vc-2010-ftell-liefert-negative-werte-wenn-eine-utf-8-datei-mit-ccsunicode-geoeffnet-wird-die-nicht-mit-fseek-funktionieren\/","title":{"rendered":"BUG: VC-2010 ftell liefert negative Werte wenn eine UTF-8 Datei mit ccs=UNICODE ge\u00f6ffnet wird, die nicht mit fseek funktionieren"},"content":{"rendered":"<p lang=\"cpp\">In <em>VS-2005<\/em> hielt die Unicode und <em>UTF-8<\/em> Unterst\u00fctzung Einzug in die <em>CRT <\/em>und damit auch in die <em>MFC<\/em>. Jochen und ich haben dazu <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/07\/03\/vc-2005-features-der-crt-fuer-unicode-unterstuetzung\/\">gebloggt<\/a>.<\/p>\n<p lang=\"cpp\">Leider ist die Implementierung nicht fehlerfrei. Wenn man eine <em>UTF-8<\/em> Datei mit <em>ccs=UNICODE<\/em> \u00f6ffnet dann liefert <em>ftell<\/em> zum Teil auch negative Werte. Das ftell nicht die exakte Position in der Datei liefert ist dokumentiert, nur sollte es mit dem Wert zumindest m\u00f6glich sein wieder fseek aufzurufen um an eine alte Dateiposition zur\u00fcck zu gelangen.<br \/>\nDas ist mit der jetzigen Implementierung nicht m\u00f6glich.<\/p>\n<p lang=\"cpp\">Ein Sample dazu ist schnell gebaut:<\/p>\n<pre lang=\"cpp\">int _tmain()\r\n{\r\n  FILE *file = NULL;\r\n  if (_tfopen_s(&amp;file,_T(\"Test.txt\"),_T(\"rt\") _T(\", ccs=UNICODE\")))\r\n    return -1;\r\n\r\n  TCHAR szBuffer[_MAX_PATH];\r\n  while (_fgetts(szBuffer,_countof(szBuffer),file))\r\n  {\r\n    int iPos = static_cast(ftell(file));\r\n    _tprintf(_T(\"%d\\n\"),iPos);\r\n    _ASSERTE(fseek(file,iPos,SEEK_SET)==0);\r\n  }\r\n\r\n  fclose(file);\r\n  return 0;\r\n}<\/pre>\n<p><a href=\"http:\/\/blog.m-ri.de\/wp-content\/uploads\/2010\/12\/TestFtell.zip\">Ein entsprechendes Sample kann man hier herunterladen<\/a>.<\/p>\n<p>Der Fehler betrifft nat\u00fcrlich auch die MFC mit <em>CStdioFile <\/em>und <em>GetPosition<\/em>!<\/p>\n<p>Hintergrund:<br \/>\nIch kam auf den Fehler, weil wir ein Programm benutzen, dass sich bestimmte Dateipositionen merkte um einen Datenimport bei einer bestimmten Bedingung, ab einer definierten Stelle, neu aufnehmen zu k\u00f6nnen. Bisher hatten wir hier nur pure ASCII Dateien erlaubt, jetzt wollten wir auch UTF-8 Dateien unterst\u00fctzen.<br \/>\nSicher man kann auch alles im Speicher zwischenhalten, aber wenn es eine simple Dateiposition ist das Ganze so weitaus Ressourcen schonender.<\/p>\n<p>Soweit ich das \u00fcbersehen kann, betrifft der Fehler alle VS-Versionen ab VS-2005. Ein entsprechende Bug wurde von mir schon vor l\u00e4ngerer Zeit auf Connect ge\u00f6ffnet. Getan hat sich bisher noch nichts:<br \/>\n<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/591030\/ftell-returns-negative-value-for-utf-8-files-opened-with-textmode-and-ccs\">https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/591030\/ftell-returns-negative-value-for-utf-8-files-opened-with-textmode-and-ccs<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In VS-2005 hielt die Unicode und UTF-8 Unterst\u00fctzung Einzug in die CRT und damit auch in die MFC. Jochen und ich haben dazu gebloggt. Leider ist die Implementierung nicht fehlerfrei. Wenn man eine UTF-8 Datei mit ccs=UNICODE \u00f6ffnet dann liefert ftell zum Teil auch negative Werte. Das ftell nicht die exakte Position in der Datei &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/12\/27\/bug-vc-2010-ftell-liefert-negative-werte-wenn-eine-utf-8-datei-mit-ccsunicode-geoeffnet-wird-die-nicht-mit-fseek-funktionieren\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eBUG: VC-2010 ftell liefert negative Werte wenn eine UTF-8 Datei mit ccs=UNICODE ge\u00f6ffnet wird, die nicht mit fseek funktionieren\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,19,4,3,27,172],"tags":[99,370,360,352,171],"class_list":["post-667","post","type-post","status-publish","format-standard","hentry","category-c","category-crt","category-mfc","category-programmieren","category-vs2008","category-vs2010","tag-bug","tag-c","tag-crt","tag-mfc","tag-vs-2010"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=667"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/667\/revisions"}],"predecessor-version":[{"id":723,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/667\/revisions\/723"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=667"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}