Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
#1

Передать в функцию файловый поток - C++

23.05.2010, 22:12. Просмотров 1442. Ответов 11
Метки нет (Все метки)

Помогите пожалуйста с файловыми потоками!
Мне нужно передать в функцию файловый поток, там его открыть,для определенного файла и дальше в программе пользоваться этим потоком. Вот что у меня вышло(фрагменты программы):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void stname(FILE*,FILE*);  //прототип функции
 
stname(stream_1,stream_2); //вызов функции
 
void Shifr2::stname(FILE*st_1,FILE*st_2) //сама функция
{
     cout<<"Enter the name of the file to encrypt "<<endl;
     cin>>NameFile_1;
     cout<<"Enter the name of the encrypted file  "<<endl;
     cin>>NameFile_2;
               
               st_1=fopen(NameFile_1,"rb");
               st_2=fopen(NameFile_2,"wb");  
     }
Ошибок никаких не выдает, прога запускается, а вот дальше с этим файлом идут операции записи в него, но файл пуст!! не могу понять где ошибки помогите пожалуйста!!!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2010, 22:12     Передать в функцию файловый поток
Посмотрите здесь:

Вывод в файловый поток C++
Указатель на файловый поток в качестве параметра функции C++
Файловый поток вместо одного слова считывает два, почему? C++
Необходимо чтобы каждый поток (не файловый) писал данные в ОТДЕЛЬНОЕ ОКНО КОНСОЛИ C++
C++ Wstring и файловый поток
C++ Как передать в качестве параметра конструктора ПОТОК,
C++ Объясните код, пожалуйста, файловый поток
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
24.05.2010, 16:25     Передать в функцию файловый поток #2
Попробуйте открыть файл в режиме r+b (это режим чтения с добавлением информации, а rw вроде режим создания или перезаписи файла)
C++
1
st_1=fopen(NameFile_1,"r+b");
Смотря для чего вы открываете файлы в разных режимах...
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
24.05.2010, 19:45  [ТС]     Передать в функцию файловый поток #3
Первый файл, мне нужно открыть просто для чтения, а второй для записи информации, вот как раз во второй файл после использования ф-ции ничего не записывается, он пуст, хотя он должен содержать информацию, я не пойму почему, может ф-ция не возвращает эти открытые потоки,но файл создает...
Суть в том,что этот кусок программы повторяется и я хочу его сделать ф-цией и ею пользоваться.
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
24.05.2010, 22:47     Передать в функцию файловый поток #4
А вы хоть где-нибудь закрываете файл? информация фактически записывается только при закрытии файла... повторюсь, режим wb перезаписывает инфу-удаляет старую. трудно говорить, не видя кода
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
24.05.2010, 23:23  [ТС]     Передать в функцию файловый поток #5
когда вот так вот все работает отлично
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
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
//SHIFR.H
#ifndef SHIFR_H
#define SHIFR_H
#include <iostream.h>
#include<stdio.h>
#include<iomanip.h>
#include "size.h"
class Shifr2
{
      public:
             Shifr2();
             void encryption();
            
             
      private:
              char NameFile_1[100], NameFile_2[100], code[1000];
              int size_file,size_code;
              FILE* stream_1, *stream_2;
              Size SZ;
              
              
              
};
Shifr2::Shifr2():SZ(){};
 
void Shifr2::encryption()
{
      cout<<"Enter the name of the file to encrypt "<<endl;
     cin>>NameFile_1;
     cout<<"Enter the name of the encrypted file  "<<endl;
     cin>>NameFile_2;
               
               stream_1=fopen(NameFile_1,"rb");
               stream_2=fopen(NameFile_2,"wb");  
               
      SZ.szcode();
      size_code=SZ.szc;
      
      SZ.szfile(NameFile_1);
      size_file=SZ.szf;
    cout<< size_code<<"  "<<size_file;
    
    
     int i=0;
     char buff;
 
     for(int j=0;j<=size_file-1;j++)
      {
        fread(&buff,1,1,stream_1);
        buff=buff+code[i];
        i++;
        if(i>=size_code)
        i=0;
        fwrite(&buff,1,1,stream_2);               
                       }                        
}
 
 
#endif
но, когда так ппц какой-то

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
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
//SHIFR.H
#ifndef SHIFR_H
#define SHIFR_H
#include <iostream.h>
#include<stdio.h>
#include<iomanip.h>
#include "size.h"
class Shifr2
{
      public:
             Shifr2();
             void encryption();
            
             
      private:
              char NameFile_1[100], NameFile_2[100], code[1000];
              int size_file,size_code;
              FILE* stream_1, *stream_2;
              Size SZ;
              void stname(FILE*,FILE*); 
              
              
};
Shifr2::Shifr2():SZ(){};
 
void Shifr2::encryption()
{
      
     stname(stream_1,stream_2);  //вызываю ф-цию
        
      SZ.szcode();
      size_code=SZ.szc;
      
      SZ.szfile(NameFile_1);
      size_file=SZ.szf;
    cout<< size_code<<"  "<<size_file;
    
    
     int i=0;
     char buff;
 
     for(int j=0;j<=size_file-1;j++)
      {
        fread(&buff,1,1,stream_1);
        buff=buff+code[i];
        i++;
        if(i>=size_code)
        i=0;
        fwrite(&buff,1,1,stream_2);               
                       }                        
}
 
void Shifr2::stname(FILE*st_1,FILE*st_2)  //сама ф-ция
{
     cout<<"Enter the name of the file to encrypt "<<endl;
     cin>>NameFile_1;
     cout<<"Enter the name of the encrypted file  "<<endl;
     cin>>NameFile_2;
               
               st_1=fopen(NameFile_1,"rb");
               st_2=fopen(NameFile_2,"wb");  
     }
#endif
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
26.05.2010, 09:27     Передать в функцию файловый поток #6
Мне кажется, все-таки стоит попробовать закрыть файл при выходе из программы или после записи информации, т.к. по факту она записывается только после закрытия файла...
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
26.05.2010, 10:09  [ТС]     Передать в функцию файловый поток #7
добавила, но все равно не записывает(
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
26.05.2010, 10:20     Передать в функцию файловый поток #8
Блин, тогда не знаю, в чем проблема ...
Цитата Сообщение от Sura Посмотреть сообщение
Первый файл, мне нужно открыть просто для чтения, а второй для записи информации, вот как раз во второй файл после использования ф-ции ничего не записывается, он пуст, хотя он должен содержать информацию
Вы написали, что вроде открываете уже созданный файл (или создаете), записываете в него информацию, затем завершаете работу программы, снова запускаете программу, смотрите файл (в котором должна быть записана информация), а он пуст. Так? Или когда вы проверяете наличие информции в файле и как)?
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
26.05.2010, 17:57  [ТС]     Передать в функцию файловый поток #9
да, я создаю файл и записываю туда информацию, после записи программа заканчивается. Потом я смотрю на тот файл, а в нем 0 байт, то есть он пуст, вот. А почему не понятно...меня уже не столько волнует моя программа, сколько вопрос почему так?
такое ощущения, что ф-ция не правильно работает, но все же программа запускается и выполняет операции....хм...
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
27.05.2010, 10:58     Передать в функцию файловый поток #10
Можно еще попробовать проверить, записывает ли он вообще:
C++
1
2
if (1!= (fwrite(&buff,1,1,stream_2)))
            cout<<"Запись не выполнена!\n";
или
C++
1
2
if (! (fwrite(&buff,1,1,stream_2)))
            cout<<"Запись не выполнена!\n";
так вроде тоже можно...
В общем, если запись не вернет количество записываемых символов, выскочит ошибка.
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
27.05.2010, 11:13     Передать в функцию файловый поток #11
насколько я понимаю вы открываете файлы в двоичном режиме для чтения и записи соответственно. Возможно вы знаете, но все-же несколько примечаний:
1) Если файл для чтения не существует - операция чтения будет окончена провалом
2) Если файл для записи не существует, то будет создан новый файл, если существует - то его размер будет усечен до нуля.
2) Режим a - файл открывается для дописывания в конец

Проверяйте корректность открытия файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <errno.h>
. . .
main() {
FILE *f;
f = fopen("filnam.txt", "rt");
if (f == NULL) {
printf(
"Ошибка открытия файла с кодом %d\n",
errno );
. . .
}
}
Проверяйте позицию файла. На всякий случай установите позицию читаемого файла на начало:
int fseek(FILE *f, long offset, int whence); установить текущую позицию в файле f
long ftell(FILE *f); получить текущую позицию в файле f
int feof(FILE *f); проверить,достигнут ли конец файла f
Пример:
C++
1
fseek(fp, 0, SEEK_SET);
3й параметр для fseek: SEEK_SET, SEEK_CUR, SEEK_END либо значение позиции в байтах
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2010, 15:39     Передать в функцию файловый поток
Еще ссылки по теме:

C++ Передать в поток двухмерный массив
C++ Файловый поток: записать в другой файл различные числа исходного файла
Файловый поток вне main() C++
Как передать аргументы из командной строки в функцию main(), что программа заработала? (файловый ввод/вывод) C++
С++, Разбитие файла, битый файл, Файловый поток C++

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

Или воспользуйтесь поиском по форуму:
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
27.05.2010, 15:39  [ТС]     Передать в функцию файловый поток #12
Возможно вы знаете, но все-же несколько примечаний:
1) Если файл для чтения не существует - операция чтения будет окончена провалом
2) Если файл для записи не существует, то будет создан новый файл, если существует - то его размер будет усечен до нуля.
2) Режим a - файл открывается для дописывания в конец
да, это я знаю и там все в порядке проверяла не раз!

а вот на счет позиции нужно попробовать...

Добавлено через 31 минуту
поставила позицию на начало - ничего не дало.

а вот когда проверила корректность открытия файла, то выполнилось условие, вывело ошибку.
Теперь у меня вопрос почему fopen возвращает NULL??
когда я открываю потоки не в функции а обыкновенно, то все ок, а тут непонятно...

и как это можно исправить?
Yandex
Объявления
27.05.2010, 15:39     Передать в функцию файловый поток
Ответ Создать тему
Опции темы

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