<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Linux Forum &mdash; Чтение символов из файла. C]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=35063</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=35063&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Чтение символов из файла. C».]]></description>
		<lastBuildDate>Wed, 04 Jun 2014 18:24:29 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Чтение символов из файла. C]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=411705#p411705</link>
			<description><![CDATA[<p>Рабочий исходник. Если комy интересно</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>#include &lt;wchar.h&gt;
#include &lt;stdint.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;stdio.h&gt;
#include &lt;locale.h&gt;

#define SZ 300 // размер блока

int main (int argc, char **argv)
{
  if (!setlocale(LC_ALL, &quot;ru_RU.UTF-8&quot;)) { // óстанавливаем лоакаль. Необходимо для правильного отображения символов
    perror (&quot;SETLOCALE FAIL&quot;);
    exit (-1);
  }

  if (argc &lt; 3) { // проверяем число аргóментов. 1 - имя программы 2 - входной файл 3 - выхлоп
    printf (&quot;Неправильное количество аргóментов. \n&quot;);
    exit -1;
  }

  FILE *fin, *fou;

  if ((fin=fopen(argv[1], &quot;r&quot;)) == NULL) { // если исходник не открылся выходим
    perror (&quot;Ошибка открытия входного файла&quot;);
    exit -1;
  }

  if ((fou=fopen(argv[2], &quot;wa&quot;)) == NULL) {  // если выхлоп не открылся закрываем исходник, вываливаемся
    fclose (fin);
    perror (&quot;Ошибка открытия выхлопа&quot;);
    exit -1;
  }

  while (!feof (fin)) { // пока lseek в fin не достиг конца файла
    wchar_t ws[SZ];  
    if (fgetws(ws, SZ, fin) == NULL) { // читаем порцию символов
      perror (&quot;Ошибка чтения &lt;-&quot;);
      break;
    }
    int i;
    int sz= (int)wcslen(ws);
    for (i=0; i&lt;sz; i++) { // крóтим массив. преобразóем все рóсские символы
      if ( (ws[i] &gt;= 1072 &amp;&amp; ws[i] &lt; 1103) || (ws[i] &gt;= 1040 &amp;&amp; ws[i] &lt; 1071) )
        ws[i]++;
    }
    if (fputws(ws, fou) &lt; 0) { // записываем
      perror (&quot;Ошибка записи в -&gt;&quot;);
      break;
    }
  }
  fclose (fin);
  fclose (fou);
}</code></pre></div></div></div><p>Код отрабатывает нормально. Только вот возникает такая ситуация.</p><p>Размер файла 10 символов. При первом заходе функция чтения захватывает все данные далее отрабатывает нормально.<br />Потом выполнение попадает на условие !feof (fin), и почему то выполнение не прерывается. Может я где ошибся ?</p>]]></description>
			<author><![CDATA[null@example.com (marikk)]]></author>
			<pubDate>Wed, 04 Jun 2014 18:24:29 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=411705#p411705</guid>
		</item>
		<item>
			<title><![CDATA[Re: Чтение символов из файла. C]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=411442#p411442</link>
			<description><![CDATA[<p><strong>marikk</strong>, используй fgetws/c для чтения и соответствующие функции для работы с многобайтовыми символами... <br />да, учитывая постановку задачи, преподу, возможно, проидётся объяснять, что такое utf-8.</p>]]></description>
			<author><![CDATA[null@example.com (Fat-Zer)]]></author>
			<pubDate>Mon, 02 Jun 2014 21:06:40 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=411442#p411442</guid>
		</item>
		<item>
			<title><![CDATA[Re: Чтение символов из файла. C]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=411404#p411404</link>
			<description><![CDATA[<div class="quotebox"><cite>marikk пишет:</cite><blockquote><p> перевести в cp1251</p></blockquote></div><p>Перед этим рекомендую проверять, русская ли это буква. А то попадёт что-то из испанского или французского алфавита с диакритическими знаками, а вы его в 1251 <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /> .</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Mon, 02 Jun 2014 16:57:07 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=411404#p411404</guid>
		</item>
		<item>
			<title><![CDATA[Re: Чтение символов из файла. C]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=411402#p411402</link>
			<description><![CDATA[<div class="quotebox"><cite>rizado пишет:</cite><blockquote><p>Алфавит-то русский, значит, в данном случае 12 байт.</p></blockquote></div><p>Ну алфавит в качестве исходного текста был выбран для наглядности. По условию лабораторной это большой текстовый файл. В котором все русские буквы нужно заменить на следующими за ними по алфавиту.</p><p>Предполагаю сделать так.</p><div class="codebox"><pre><code>FILE *fi, fo;

открыть потоки 

while (!feof(fi)) {
   прочитать порцию данных из fi
   перевести в cp1251
   заменить русские символы
   перевести обратно
   записать в fo.
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (marikk)]]></author>
			<pubDate>Mon, 02 Jun 2014 16:40:46 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=411402#p411402</guid>
		</item>
		<item>
			<title><![CDATA[Re: Чтение символов из файла. C]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=411396#p411396</link>
			<description><![CDATA[<div class="quotebox"><cite>marikk пишет:</cite><blockquote><p>Пробелы цифры и латинские символы занимают по одному байту. В этом то и вся проблема.</p></blockquote></div><p>Так у Вас написано:<br /></p><div class="quotebox"><cite>marikk пишет:</cite><blockquote><p>Алфовитную последовательность выводит так</p><p>&nbsp; &nbsp; абвгд?|||</p></blockquote></div><p>Алфавит-то русский, значит, в данном случае 12 байт.</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Mon, 02 Jun 2014 16:21:56 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=411396#p411396</guid>
		</item>
		<item>
			<title><![CDATA[Re: Чтение символов из файла. C]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=411395#p411395</link>
			<description><![CDATA[<div class="quotebox"><cite>rizado пишет:</cite><blockquote><p>Я не спец по C, но почему считывается 11 байт, а не 12? Получается, что последний символ до конца не прочитан, вот его и не может вывести.<br />Upd. Вы указываете размер блока для чтения и количество. И при двухбайтовой кодировке последний символ не читается. Попробуйте 12 указать.</p></blockquote></div><p>Пробелы цифры и латинские символы занимают по одному байту. В этом то и вся проблема.</p>]]></description>
			<author><![CDATA[null@example.com (marikk)]]></author>
			<pubDate>Mon, 02 Jun 2014 16:16:43 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=411395#p411395</guid>
		</item>
		<item>
			<title><![CDATA[Re: Чтение символов из файла. C]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=411390#p411390</link>
			<description><![CDATA[<div class="quotebox"><cite>marikk пишет:</cite><blockquote><p> fread (ts, 11, 1, fin);</p></blockquote></div><p>Я не спец по C, но почему считывается 11 байт, а не 12? Получается, что последний символ до конца не прочитан, вот его и не может вывести.</p><p>Upd. Вы указываете размер блока для чтения и количество. И при двухбайтовой кодировке последний символ не читается. Попробуйте 12 указать.</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Mon, 02 Jun 2014 16:03:38 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=411390#p411390</guid>
		</item>
		<item>
			<title><![CDATA[Чтение символов из файла. C]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=411382#p411382</link>
			<description><![CDATA[<p>Всем привет. Подскажите пожалуйста как прочитать n-ое количество символов из файла?<br />Проблема собственно в следующем. В системе установлена кодировка utf-8. В ней русские символы занимают 2 байта. А все библиотечные функции(fread, fgets) считывают определенное количество байт(кроме fgets). Другими словами в случае неудачи теряется один символ. <br />Пример</p><div class="codebox"><pre><code>  FILE *fin, *fou;

  if ((fin=fopen(argv[1], &quot;r&quot;)) == NULL) { // если исходник не открылся выходим
    perror (&quot;Ошибка открытия входного файла&quot;);
    exit -1;
  }
  char ts[SZ];
  memset (ts, 0, SZ);

  fread  (ts, 11, 1, fin);
  printf (&quot;%s||| \n&quot;, ts);
  fclose(fin);</code></pre></div><p>Алфовитную последовательность выводит так<br /></p><div class="quotebox"><blockquote><p>абвгд?|||</p></blockquote></div><p>Подскажите пожалуйста как с этим бороться ?</p>]]></description>
			<author><![CDATA[null@example.com (marikk)]]></author>
			<pubDate>Mon, 02 Jun 2014 15:18:07 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=411382#p411382</guid>
		</item>
	</channel>
</rss>
