Работа с файлами

Форум для программистов

Сообщение x0r » Сб сен 27, 2003 5:20 pm

Доброе.
Код: выделить все
while (ch!=EOF)
 {
  ch=fgetc(stream);   ****
  while (ch1!='\n')  ch1=fgetc(stream);
 }

****: В этом месте из stream будет считан символ и курсор сдвинется на символ вправо, те к концу файла. Надо сделать, чтобы второй цикл начал читать с начала строки, те чтобы в ch поступил первый символ строки. Вообще задача проще, но было бы интересно услышать решения именно таким способом.
И еще:
Код: выделить все
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main (void)
{
FILE *stream,*stout; char ch=0,ch1;
stout = fopen("output.txt","w");
stream = fopen("sort.txt","r");

while (ch!=EOF)
 {
  ch=fgetc(stream);
  fprintf(stout,"0");
  while (ch1!='\n')
   {
    ch1=fgetc(stream);
    fprintf(stout,"%c",ch1);
   }
  ch1=0;
 }
void fcloseall();
return 0;
}

Почему эта программа после обработки данных из входящего потока выводит в исходящий поток бесконечное число символов 'я'? Есть предположение. что она не находит символ конца файла.

Для работы используется компилятор Dev C++ 4.9.8.1.

Заранее спасибо.
Последний раз редактировалось x0r Сб сен 27, 2003 5:27 pm, всего редактировалось 1 раз.
x0r
Ст. лейтенант
 
Сообщений: 132
Зарегистрирован: Вс мар 09, 2003 11:11 am
Откуда: Россия, Челябинск.
Пункты репутации: 0

Сообщение SiMM » Сб сен 27, 2003 8:53 pm

Код: выделить все
while (ch!=EOF){
  ch=fgetc(stream);
  fprintf(stout,"0");
  while (ch1!='\n'){
    ch1=fgetc(stream);
    fprintf(stout,"%c",ch1);
  }
  ch1=0;
}
По моему, вообще некорректное решение (лучше бы написал исходную задачу):
Код: выделить все
ch=fgetc(stream);
while(ch!=EOF)
 do{
   fprintf(stout,"%c",ch); // можно как то попроще наверно - через fputc или что-то подобное - лень разбираться :)
 }while( ((ch=fgetc(stream))!='\n') && (ch!=EOF) );
данное решение - тоже не блещет - потому что исходная задача совсем не ясна.
Последний раз редактировалось SiMM Сб сен 27, 2003 8:54 pm, всего редактировалось 1 раз.
IRC: <a href='http://www.fileforum.ru/irc.php' target='_blank'>RUSNET #fileforum</a> (irc.tsk.ru:6669)
SiMM
Подполковник
 
Сообщений: 588
Зарегистрирован: Чт июн 13, 2002 8:41 am
Пункты репутации: 0

Сообщение x0r » Вс сен 28, 2003 4:25 am

Задача следующая: в файле input.txt считать первую строку вида xy.txt:word и записать ее в output.txt видом: 0xy.txt:word. Вообще-то говоря сделать чтобы он так записал у меня получилось, только программа после обработки списка таких выражений начинает обрабатывать судя по всему конец файла - его же и пишет. Только почему она начинает дописывать букву 'я' вместо завершения работы - непонятно.
x0r
Ст. лейтенант
 
Сообщений: 132
Зарегистрирован: Вс мар 09, 2003 11:11 am
Откуда: Россия, Челябинск.
Пункты репутации: 0

Сообщение x0r » Вс сен 28, 2003 12:01 pm

В общем-то все решилось так:
Код: выделить все
#include <stdio.h>
int main (void)
{
FILE *stream,*stout; char ch;
stout = fopen("output.txt","w");
stream = fopen("sort.txt","r");
while ((ch = fgetc(stream))!=EOF)
 {
  if (ch=='\n') fprintf(stout,"\n0");
  if (ch!='\n') fprintf(stout,"%c",ch);
 }
void fcloseall();
return 0;
}
Последний раз редактировалось x0r Вс сен 28, 2003 12:11 pm, всего редактировалось 1 раз.
x0r
Ст. лейтенант
 
Сообщений: 132
Зарегистрирован: Вс мар 09, 2003 11:11 am
Откуда: Россия, Челябинск.
Пункты репутации: 0

Сообщение Lynn » Вс сен 28, 2003 2:46 pm

Возможно EOF=-1, а char у тебя по умолчанию unsigned. Я на C не писал уже года четыре, так что не надо забрасывать меня камнями, если я не прав. <!--emo&;)-->Изображение<!--endemo-->
Where were you while we were getting high? — Oasis, Champagne Supernova
Lynn
Капитан
 
Сообщений: 267
Зарегистрирован: Пн апр 07, 2003 1:09 pm
Откуда: Москва
Пункты репутации: 0

Сообщение x0r » Пн сен 29, 2003 8:58 am

Если текущая позиция является концом файла, функция eof возвращает значение 1; в противном случае значение 0. При возникновении ошибки возвращается значение -1, и глобальная переменная errno получает значение: EBADF - Неверный номер файла.

Может быть и так, но в таком случае почему он возвращает такое значение?
x0r
Ст. лейтенант
 
Сообщений: 132
Зарегистрирован: Вс мар 09, 2003 11:11 am
Откуда: Россия, Челябинск.
Пункты репутации: 0

Сообщение SiMM » Пн сен 29, 2003 2:24 pm

<!--QuoteBegin--x0r+Sep 29 2003, 12:58--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (x0r @ Sep 29 2003, 12:58)</td></tr><tr><td id='QUOTE'><!--QuoteEBegin--> Может быть и так, но в таком случае почему он возвращает такое значение? <!--QuoteEnd--> </td></tr></table><span class='postcolor'> <!--QuoteEEnd-->
Дело не в том, какое значение у тебя возвращает eof (он то походу работал правильно), а в том, что ты достиг конца файла раньше, чем наткнулся на '\n' (попробуй свою программу "проиграть" в уме для примера с коротеньким файлом) и потом упёрся в поиске '\n' там, где его нет (за пределами файла <!--emo&;)-->Изображение<!--endemo--> ).
IRC: <a href='http://www.fileforum.ru/irc.php' target='_blank'>RUSNET #fileforum</a> (irc.tsk.ru:6669)
SiMM
Подполковник
 
Сообщений: 588
Зарегистрирован: Чт июн 13, 2002 8:41 am
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

cron