Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 137, средняя оценка - 4.80
ganjawar
0 / 0 / 1
Регистрация: 09.09.2011
Сообщений: 40
#1

Функция feof(stream) зацикливается и не доходит о конца файла - C++

13.09.2011, 20:01. Просмотров 21254. Ответов 22
Метки нет (Все метки)

Здравствуйте
Проблема в том что функция зацикливается,не доходит до конца файла
вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void crypt(WIN32_FIND_DATAA FindFileData,LPCSTR Dir)
{
        FILE *stream;
        char path[20]={0};
 
        if ((strcmp(FindFileData.cFileName,"..")==0) || (strcmp(FindFileData.cFileName,".")==0))//нужен только файл
        {
            std::cout << FindFileData.cFileName << "\n";
        }else
        {
            strcpy(path, Dir);
            path[strlen(path)-1]=0; //удаляем "*"
            strcat(path, FindFileData.cFileName);//склеиваем путь и имя файла
            stream = fopen(path,"r+");
            //std::cout << path << "\n";
            if (stream!=NULL)//если есть что считывать
            {
                while ( !feof(stream))//пока не конец файла
                {
                    
                }
            }
        }
}

http://www.cyberforum.ru/cpp-beginners/thread283846.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2011, 20:01
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция feof(stream) зацикливается и не доходит о конца файла (C++):

Рекурсивная функция, выписывающая число с конца
Доброго Времени суток , Как написать рекурсирную функцию, которая выписывает...

Чтение файла с несколькими знаками конца файла
В файле несколько раз встречается ноль, и ни как не получается прочитать его...

Программа не доходит до конца файла и зацикливается
она не видит конца файла и зацикливается на 21 или на 30 строчке... Программа...

Программа не доходит до конца
Программа не доходит до конца.В чем может быть ошибка? Иногда запрашивает ввод...

Дефрагментация не доходит до конца
Когда делаешь дефрагментацию, всегда хочется увидеть идеальную непрерывную...

22
Ruu
13 / 13 / 1
Регистрация: 20.07.2010
Сообщений: 43
14.09.2011, 15:04 #2
Цитата Сообщение от ganjawar Посмотреть сообщение
stream = fopen(path,"r+");
C++
1
ifstream stream(path);
Цитата Сообщение от ganjawar Посмотреть сообщение
if (stream!=NULL)//если есть что считывать
C++
1
if (stream.is_open())
Цитата Сообщение от ganjawar Посмотреть сообщение
while ( !feof(stream))//пока не конец файла
C++
1
while(!stream.eof())
1
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
14.09.2011, 15:33 #3
Цитата Сообщение от ganjawar Посмотреть сообщение
while ( !feof(stream))//пока не конец файла
{
}
А как же мы попадем в конец файла, если из него ничего не читается?
1
ganjawar
0 / 0 / 1
Регистрация: 09.09.2011
Сообщений: 40
15.09.2011, 14:23  [ТС] #4
Спасибо.Попробую

Добавлено через 48 минут
а как Мне что-нибудь взять из файла?
точнее Мне надо брать каждый символ и менять его код..типо шифрования
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
15.09.2011, 14:29 #5
Для Си
C
1
2
3
4
5
int c;
while ((c = fgetc(stream)) != EOF)
{
/*что нибудь делаем с считаными символом*/
}
Для ++
C++
1
2
3
4
while ((c = stream.get()) != EOF)
{
/*что нибудь делаем с считаными символом*/
}
2
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
15.09.2011, 14:31 #6
Только не
C
1
char c;
а
C
1
int c;
2
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
15.09.2011, 14:32 #7
А еще лучше будет почитать про стандартные средства работы с файлами

Добавлено через 27 секунд
grizlik78, успел исправить
1
ganjawar
0 / 0 / 1
Регистрация: 09.09.2011
Сообщений: 40
15.09.2011, 14:48  [ТС] #8
а если c это int то в с будет код символа?
МНе нужен сам вимвол изменить его код и записать обратно

Добавлено через 6 минут
код изменил))
как записать обратно и чтобы не число а символ?
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
15.09.2011, 14:48 #9
Да будет в с код символа. Просто функции надо возвращать 256 кодов символов и еще один специальный код, обозначающий конец файла. Всего 257 значений. Разрядности char'а для этого не хватает.
1
ganjawar
0 / 0 / 1
Регистрация: 09.09.2011
Сообщений: 40
15.09.2011, 14:51  [ТС] #10
это Я понял)как записать обратно?
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
15.09.2011, 14:58 #11
Если в тот же самый файл, то примерно так
C
1
2
fseek (stream, SEEK_CUR, -1); /*возвращаемся на один символ назад*/
fputc(stream, c);
C++
1
2
3
//stream должен иметь тип fstream
stream.seekp(-1, ios_base::cur);
stream.put(c);
1
ganjawar
0 / 0 / 1
Регистрация: 09.09.2011
Сообщений: 40
15.09.2011, 15:01  [ТС] #12
а как же Мне сделать stream тип fstream??
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::ifstream file(path);
            if (file.is_open())//если файл открыт
            {
                    int c;
                    while ((c = file.get()) != EOF)
                    {
                    /*что нибудь делаем с считаными символом*/
                        std::cout << c <<"\t";
                        c = c+1;
                        std::cout << c <<"\n";
                        file.seekp(-1, ios_base::cur);
                        file.put(c);
                        //fputs (c,file);
                    }
            }
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
15.09.2011, 15:05 #13
Цитата Сообщение от ganjawar Посмотреть сообщение
C++
1
std::ifstream file(path);
=>
C++
1
std::fstream file(path);
ifstream для чтения
ofstream для записи
fstream для чтения-записи (хотя одну из функций можно отключать для конкретного объекта)
1
ganjawar
0 / 0 / 1
Регистрация: 09.09.2011
Сообщений: 40
15.09.2011, 15:09  [ТС] #14
спасибо большое..
и последний вопрос
как Мне сделать так,чтобы Я брал символ,менял его и записывал вместо того,который Я взял
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
15.09.2011, 15:13 #15
Так в 11 посте и есть вариант с перезаписью нового содержимого поверх старого.
1
ganjawar
0 / 0 / 1
Регистрация: 09.09.2011
Сообщений: 40
15.09.2011, 15:33  [ТС] #16
вместо qwerty получается rxxxxxxw и при чем все зацикливается..это получилось в результате отладки

Добавлено через 14 минут
как Я понял в режиме отладки ,что первый символ меняет нормально,а начиная со 2-го он берет символ меняет его ,а который был вставляет вместо следующего и получается бесконечно один и тот же символ
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
15.09.2011, 15:43 #17
Чуть-чуть подправил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(int argc, char* argv[])
{
   int c;
   fstream f;
   streampos pos;
   f.open("doc.txt");
   if (!f.is_open())
      return 1;
   while ((c = f.get()) != EOF)
   {
      cout << (char)c <<"\t";
      c = c+1;
      cout << (char)c <<"\n";
      pos = f.tellp();
      f.seekp(pos-1);
      f.put((char)c);
      f.tellp();
   }
   f.close();
   system("pause");
   return 0;
}
1
ganjawar
0 / 0 / 1
Регистрация: 09.09.2011
Сообщений: 40
15.09.2011, 15:51  [ТС] #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::fstream file(path);
            if (file.is_open())//если файл открыт
            {
                    int c;
                    streampos pos;
                    while ((c = file.get()) != EOF)
                    {
                    /*что нибудь делаем с считаными символом*/
                        std::cout << c <<"\t";
                        c = c+1;
                        std::cout << c <<"\n";
                        pos = file.tellp();
                        file.seekp(pos-1);
                        file.put((char)c);
                        file.tellp();
 
                    }
            }
ругается на (pos-1)
4 IntelliSense: существует несколько операторов "-", соответствующих этим операндам: c:\documents and settings\admin\рабочий стол\os_1\os_1\main.cpp 58 21 OS_1

Добавлено через 1 минуту
Ошибка 4 error C2666: std::fpos<_Statetype>::operator -: для 3 перегрузок есть подобные преобразования c:\documents and settings\admin\рабочий стол\os_1\os_1\main.cpp 58 1 OS_1
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
15.09.2011, 16:09 #19
Цитата Сообщение от ganjawar Посмотреть сообщение
file.seekp(pos-1);
C++
1
file.seekp((int)pos-1);
0
ganjawar
0 / 0 / 1
Регистрация: 09.09.2011
Сообщений: 40
15.09.2011, 16:12  [ТС] #20
опять на 2-м символе зацикливается
0
15.09.2011, 16:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2011, 16:12
Привет! Вот еще темы с решениями:

Прогресбар не доходит до конца
Есть код: private void timer1_Tick(object sender, EventArgs e) { ...

Цикл не доходит до конца
Здравствуйте! Не могу разобраться, почему цикл for не доходит до конца. Ниже я...

Не доходит скролл до конца Jscrollpane
Здравствуйте, вот пример http://dodi.vv.si . Скролл не доходит до конца, я так...

Звук на ноутбуке. Регулятор звука не доходит до конца
Имеется ноутбук MSI cx620 Вместе с ним имеется и проблема с громкостью звука....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru