Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

23.05.2010, 22:12. Просмотров 1493. Ответов 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");  
     }
Ошибок никаких не выдает, прога запускается, а вот дальше с этим файлом идут операции записи в него, но файл пуст!! не могу понять где ошибки помогите пожалуйста!!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2010, 22:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передать в функцию файловый поток (C++):

Как передать аргументы из командной строки в функцию main(), что программа заработала? (файловый ввод/вывод) - C++
Как передать аргументы из командной строки в аргумент int main(int argc, char *argv), что бы заработала это прога: #include &lt;iostream&gt; ...

Wstring и файловый поток - C++
Беда за бедой, я уже 2 тему создаю. Короче из-за того, что теперь я использую вместо string Wstring не знаю, как грамотно файловый поток...

Вывод в файловый поток - C++
проверьте код // ooooo.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream.h&gt; ...

Файловый поток вне main() - C++
Есть программа вывода на экран консоли через cout, решил заменить cout на out, вывод через функцию свою #include &lt;iostream&gt; #include...

Объясните код, пожалуйста, файловый поток - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; using namespace std; void main() { setlocale(LC_ALL, &quot;&quot;); ...

Файловый поток узнать количество строк - C++
Вопрос простой, нужно узнать количество строк в файле.

11
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");
Смотря для чего вы открываете файлы в разных режимах...
0
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
24.05.2010, 19:45  [ТС] #3
Первый файл, мне нужно открыть просто для чтения, а второй для записи информации, вот как раз во второй файл после использования ф-ции ничего не записывается, он пуст, хотя он должен содержать информацию, я не пойму почему, может ф-ция не возвращает эти открытые потоки,но файл создает...
Суть в том,что этот кусок программы повторяется и я хочу его сделать ф-цией и ею пользоваться.
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
24.05.2010, 22:47 #4
А вы хоть где-нибудь закрываете файл? информация фактически записывается только при закрытии файла... повторюсь, режим wb перезаписывает инфу-удаляет старую. трудно говорить, не видя кода
0
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
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
26.05.2010, 09:27 #6
Мне кажется, все-таки стоит попробовать закрыть файл при выходе из программы или после записи информации, т.к. по факту она записывается только после закрытия файла...
1
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
26.05.2010, 10:09  [ТС] #7
добавила, но все равно не записывает(
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
26.05.2010, 10:20 #8
Блин, тогда не знаю, в чем проблема ...
Цитата Сообщение от Sura Посмотреть сообщение
Первый файл, мне нужно открыть просто для чтения, а второй для записи информации, вот как раз во второй файл после использования ф-ции ничего не записывается, он пуст, хотя он должен содержать информацию
Вы написали, что вроде открываете уже созданный файл (или создаете), записываете в него информацию, затем завершаете работу программы, снова запускаете программу, смотрите файл (в котором должна быть записана информация), а он пуст. Так? Или когда вы проверяете наличие информции в файле и как)?
0
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
26.05.2010, 17:57  [ТС] #9
да, я создаю файл и записываю туда информацию, после записи программа заканчивается. Потом я смотрю на тот файл, а в нем 0 байт, то есть он пуст, вот. А почему не понятно...меня уже не столько волнует моя программа, сколько вопрос почему так?
такое ощущения, что ф-ция не правильно работает, но все же программа запускается и выполняет операции....хм...
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";
так вроде тоже можно...
В общем, если запись не вернет количество записываемых символов, выскочит ошибка.
0
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 либо значение позиции в байтах
0
Sura
6 / 6 / 0
Регистрация: 23.05.2010
Сообщений: 87
27.05.2010, 15:39  [ТС] #12
Возможно вы знаете, но все-же несколько примечаний:
1) Если файл для чтения не существует - операция чтения будет окончена провалом
2) Если файл для записи не существует, то будет создан новый файл, если существует - то его размер будет усечен до нуля.
2) Режим a - файл открывается для дописывания в конец
да, это я знаю и там все в порядке проверяла не раз!

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

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

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

и как это можно исправить?
0
27.05.2010, 15:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2010, 15:39
Привет! Вот еще темы с ответами:

С++, Разбитие файла, битый файл, Файловый поток - C++
Суть, нужно разбить файл,(у многих будут болеть глаза от этого кода, так что извиняюсь, это просто сырой кусок кода, относитесь так к...

Указатель на файловый поток в качестве параметра функции - C++
Здравствуйте! Хочется/нужно написать что-то вроде функции которая читала бы из файлового потока передаваемого ей в качестве параметра....

Файловый поток вместо одного слова считывает два, почему? - C++
Друзья! Вот код #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main () { ifstream ifs...

Файловый поток: записать в другой файл различные числа исходного файла - C++
Дан файл целых чисел. Записать в другой файл различные числа исходного файла.


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

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

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