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

почему PRINTF не работает? - C++

Восстановить пароль Регистрация
 
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
15.03.2013, 23:47     почему PRINTF не работает? #1
есть файл с следующим содержаним:
aa fr
ab ty
ac qw
..
az re
нужно найти в этом файле комбинацию ab и во второй файл записать 2 символа, стоящие после пробела. я записываю в массив что d[0]='a', d[1]='b'. Далее в цикле от 0 до 6 (каждая строка содержит 6 символов, анпрмиер, aa fr\n) считываю посимвольно все 6 символов и записываю каждый символ в массив st[6]. Далее, т.к. надо комбинацию ab найти в 1м столбце, то проверяю если st[0] и st[1] равны соответственно 'a' и 'b', то записываю в файл следущие 2 символа из строки после пробела.
Вроде все верно, в чем ошибка не пойму! Подскажи, пожалуйста!!!

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char st[6];
char d[2];
char x; 
 while (!feof(fp1))
 {
 
 for(l=0; l<6; l++)
 {
 
 fread(&x,sizeof(char),1,fp1);
 st[l]=x;
 printf("%c ", st[l]); //!!!!!!!! что то не так, не выводит на экран символы
 }
 if((st[0]==d[0]) && (st[1]==d[1]))
 {
 fwrite(&st[3],sizeof(char),1,fp2);
 fwrite(&st[4],sizeof(char),1,fp2);
 
 }
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 23:47     почему PRINTF не работает?
Посмотрите здесь:

C++ Не работает printf без \n в цикле for
почему не работает printf? С++ C++
C++ почему printf не видит некоторые аргументы?
Printf не работает C++
Тупо не работает функция printf... C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Azdeman
Модератор
 Аватар для Azdeman
1503 / 1053 / 278
Регистрация: 12.01.2011
Сообщений: 4,306
16.03.2013, 00:03     почему PRINTF не работает? #2
C++
1
2
*/ В место этого 
printf("%c ", st[l]);
Добавлено через 2 минуты
тьфу я же не хотел что бы оно отослалось. Извеняюсь
C++
1
2
cout 
попробуйте в место printf
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 00:13  [ТС]     почему PRINTF не работает? #3
а какая разница??
попробовала, все равно ничего не выводится на экран

Добавлено через 3 минуты
fread(&x,sizeof(char),1,fp1);
единственное что вот думаю, может быть такое, что он не считывает из файла, потому что в него записывались строки так:

fprintf(fp1, "%c%c %s\n",i,j,a[n]);

где a[n] ="%c%c\0"
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
16.03.2013, 00:21     почему PRINTF не работает? #4
Цитата Сообщение от Kr Посмотреть сообщение
есть файл с следующим содержаним:
aa fr
ab ty
ac qw
..
az re
нужно найти в этом файле комбинацию ab и во второй файл записать 2 символа, стоящие после пробела.
строго для этого задания
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <fstream>
 
int main()
{
    std::ifstream ifs("input.txt");
    if (!ifs) return 1;
    char x[2];
    for (int i=0; i < 4; i++)
        ifs >> x;
    std::ofstream o("output.txt");
    o << x;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.03.2013, 01:32     почему PRINTF не работает? #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
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
    ifstream fin("1.txt");
    if (!fin.is_open()) cout << "Error!" << endl;
    else
    {
        string str = "";
        while (true)
        {
            fin >> str;
            
            if (str == "ab")
            {
                fin >> str;
                
                fin.close();
                break;
            }
            fin >> str;
            if (fin.eof()) break;
        }
        if (!str.empty())
        {
           ofstream fout("2.txt");
           
           fout << str;
           
           cout << "Done!" << endl;
           fout.close();
        }
        else cout << "Not found!" << endl;
    }
 
    system("pause");
    return 0;
}
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.03.2013, 01:36     почему PRINTF не работает? #6
Kr, а файл вообще открывается? Вы проверку открытия файла делаете?
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 13:56  [ТС]     почему PRINTF не работает? #7
файл открывается да.

если в файл записать строку , а потом считывать из файла посимвольно - так можно???
это я об этом :
fprintf(fp1, "%c%c %s\n",i,j,a[n]);
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.03.2013, 14:05     почему PRINTF не работает? #8
Цитата Сообщение от Kr Посмотреть сообщение
если в файл записать строку , а потом считывать из файла
Меня начинают мучить смутные сомнения. Запись в файл и считывание из него происходят в одном запуске программы, файловый указатель fp1 в вашем листинге используется и для записи, и для последующего чтения?
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 14:11  [ТС]     почему PRINTF не работает? #9
да-да-да, именно так! но я открывала его так

C
1
2
3
4
5
6
fp1=fopen(file,"r+"); //r+ прочитала что вроде как и чтение и запись, нет???
  if (fp1==NULL)
  {
     printf("Nevozmozhno sozdat file!\n");
     return 1;
  }
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.03.2013, 14:30     почему PRINTF не работает? #10
Хмм.. есть такое понятие, как "файловый указатель", который указывает текущую позицию в файле, с которого будет производиться чтение или куда будут записываться данные. При открытии файла указатель устанавливается на начало оного и автоматически "смещается" при чтении\записи на количество считанных\записанных байт. Соответственно, после записи в файл, указатель будет указывать на конец файла, и в таком состоянии попытки считать из файла не увенчаются успехом. Для начала нужно установить указатель на нужную позицию в файле, делать это придется ручками с помощью такой хитрой функции
C
1
int fseek(FILE *stream, long offset, int whence);
Первым аргументом передаем файловый указатель, вторым количество байт, на которые нужно сместить указатель, третьим параметром указываем относительно чего отсчитывать. Третий параметр может принимать следующие значения:
SEEK_SET 0 начало файла
SEEK_CUR 1 текущая позиция
SEEK_END 2 конец файла
Допустим, чтобы переместить указатель на начало файла, нужно сделать следующий вызов функции
C
1
fseek(fp1, 0, SEEK_SET); // установить указатель на нулевой байт от начала файла
Так же может пригодиться функция
C
1
long int ftell(FILE *stream);
которая возвращает текущее положение файлового указателя.
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 15:02  [ТС]     почему PRINTF не работает? #11
C++
1
2
3
4
5
6
7
8
fseek(fp1, 0, SEEK_SET);
                    for(l=0; l<6; l++)
                   {
 
                      fread(&x,sizeof(char),1,fp1);
                      st[l]=x;
                      printf("%c ", st[l]);
                    }
все равно PRINTF не работает!!
ответьте ПОЖАЛУЙСТА если в файл записать строку , а потом считывать из файла посимвольно - так можно???
C++
1
2
 fprintf(fp1, "%c%c %s\n",i,j,a[n]);
 fread(&x,sizeof(char),1,fp1);
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.03.2013, 15:21     почему PRINTF не работает? #12
Цитата Сообщение от Kr Посмотреть сообщение
так можно???
так можно. Попробуйте еще после окончания записи такую функцию
C
1
clearerr(fp1);
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 15:36  [ТС]     почему PRINTF не работает? #13
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <string>
#include <cstdlib>
#include <time.h>
using namespace std;
int main()
{
 
  FILE *fp, *fp1, *fp2;
  char msg1[15]="msg1.txt";
  char msg2[15]="msg2.txt";
  char key[100]="key.txt";
  int N=0,n=0,k,k2,l,q,p;
  char i,j,c, d1,x;
  char d[2];
  char a[676][3];
  char st[6];
  char s[3];
  char* temp=s;
  char zam[3];
  int mas[676];
  srand (time(NULL));
 
  fp=fopen(msg1,"r");
  if (fp==NULL)
  {
     printf("file ne nayden!\n");
     return 1;
  }
 
  fp1=fopen(key,"w+");
  if (fp1==NULL)
  {
     printf("Nevozmozhno sozdat file key!\n");
     return 1;
  }
 
  fp2=fopen(msg2,"w");
  if (fp2==NULL)
  {
     printf("Nevozmozhno sozdat file 2!\n");
     return 1;
  }
 
for(k=0; k<625; k++)
{
    mas[k]=0;
}
 
for(l=0; l<6; l++)
{
    st[l]=0;
}
//формирую массив двубуквенных комбинаций для того чтобы каждая комбинация имела совй порядковый номер
p=0;
for ( i='a'; i<='z'; i++)
{
    for (j = 'a'; j <= 'z'; j++)
    {
        sprintf(a[p], "%c%c\0", i,j);
        p++;
    }
}
//после этого массив a[0]=aa,  a[1]=ab,  a[2]=ac, .. a[675]=zz
 
// генерация ключа
k=0; p=0;
for ( i='a'; i<='z'; i++)
{
    for (j = 'a'; j <= 'z'; j++)
    {
       while(true)
       {
          n=rand()%676;
          for (q = 0; q < 676; q++)
          {
              if (n == mas[q]) break;
          }
          if (q==676)
          {
              mas[p]=n;
              fprintf(fp1, "%c%c %s\n",i,j,a[n]);  
              p++;
              break;
          }
       }
    }
}
 
clearerr(fp1);
p=0;
while (!feof(fp)) // пока не конец файла MSG1.txt  
{
    for(q=0; q<2; q++) //считываю посимвольно 2 символа и для них ищу в KEY.txt соответствующую пару /////////////////////   подозреваю что может надо не по 2 символа считывать из MSG1.txt  может тут проблема
    {
        c=fgetc(fp);
        d[q]=c;
        if ( (c==' ')  || (c==',') || (c=='.') || (c==':')  || (c=='\n') ) //если пробел или какой то знак препинания 
        {
            fputc(d[0],fp2); //то оставляем его как есть в файл MSG2.txt 
            fputc(d[1],fp2);
        }
        else
        {
            d[q]=c; // иначе запоминаем его
            if(q==2) // если 2 символа считаны и оба символы, то обращаемся к файлу KEY.txt
            {
                while (!feof(fp1))
                {
                    fp1=fopen(key,"r");
                    if (fp1==NULL)
                    {
                        printf("Nevozmozhno sozdat file key!\n");
                        return 1;
                    }
                   // fread(&st, 5*sizeof(char),5,fp1);
                   // fseek(fp1, 0, SEEK_SET);
                    for(l=0; l<6; l++)
                   {
 
                    //  st[l]=fgetc(fp1);
                      fread(&x,sizeof(char),1,fp1);
                      st[l]=x;
                      printf("%c ", st[l]);
                    }
                    if((st[0]==d[0]) && (st[1]==d[1])) //если первые два символа равны тем которые ищем, то
                    {
                      //  fwrite(&st[3],sizeof(char),1,fp2);
                      //  fwrite(&st[4],sizeof(char),1,fp2);
 
 
                        fputc(st[3], fp2); //  записываем их в файл MSG2.txt
                        fputc(st[4], fp2);
                    }
                }
            }
 
        }
    }
}
  fclose(fp);
  fclose(fp1);
  fclose(fp2);
  return 0;
}

прикладываю весь код, посомтрите, пожалуйста в чем проблема!!! такое ощущение что к ключу не обращается вообще, сколько раз запускаю прогу, в MSG2.txt просто записывает 3 взятых с потолка символа, и каждый раз они одни и те же!

ИСПРАВЬТЕ пожалуйста ТУТ что не так!!! Буду очень благодарна!
Croessmah
16.03.2013, 15:45
  #14

Не по теме:

Не забывайте выделять код тегами подсветки:
Название: Безымянный.png
Просмотров: 78

Размер: 7.2 Кб

kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.03.2013, 16:12     почему PRINTF не работает? #15
От оно че А оно оказывается в эту часть кода-то программа вообще не попадает.
Цитата Сообщение от Kr Посмотреть сообщение
for(q=0; q<2; q++) //считываю посимвольно 2 символа и для них ищу в KEY.txt соответствующую пару ///////////////////// * подозреваю что может надо не по 2 символа считывать из MSG1.txt *может тут проблема
* * {
* * * * c=fgetc(fp);
* * * * d[q]=c;
* * * * if ( (c==' ') *|| (c==',') || (c=='.') || (c==':') *|| (c=='\n') ) //если пробел или какой то знак препинания
* * * * {
* * * * * * fputc(d[0],fp2); //то оставляем его как есть в файл MSG2.txt
* * * * * * fputc(d[1],fp2);
* * * * }
* * * * else
* * * * {
* * * * * * d[q]=c; // иначе запоминаем его
* * * * * * if(q==2) // если 2 символа считаны и оба символы, то обращаемся к файлу KEY.
Как сие безобразие понимать?
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 19:25  [ТС]     почему PRINTF не работает? #16
ппц =((( всю голову сломала, в чем проблема
kazak, благодарю
теперь работает, правда неправильно, но там сейчас посмотрю, надеюсь разберусь что не так!!

Добавлено через 2 часа 52 минуты
Посмотрите пожалуйста, в файле MSG1.txt следущее: abcdefghijklmnopqr
в файле KEY.txt :
aa lc
ab pq
ac sw
ad oo
..
в файл MSG2.txt записывает только pq

а если в файле MSG1.txt следущее: abcdefghijk lmnopqr
в файле KEY.txt :
aa bt
ab zr
ac se
ad ow
в файл MSG2.txt записывает только zrk --- т.е. записывает еще символ,который стоит перед пробелом в исходном файле!!

а должно быть так: все из MSG1.txt разбивать по 2 символа и менять на соответствующие символы из ключа, если например записано abc defr - то ищет ab, меняет, прочитал с и пробел - с записал без изменений и пробел записал и тд.

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
while (!feof(fp))
{
 
    for(q=0; q<2; q++)
    {
        c=fgetc(fp);
        d[q]=c;
        if ( (c==' ')  || (c==',') || (c=='.') || (c==':')  || (c=='\n') )
        {
            if(q==1)
            {
 
                fputc(d[0],fp2);
                fputc(d[1],fp2);
            }
 
            else
            {
               fputc(d[q],fp2);
               q=0;
            }
        }
        else
        {
            d[q]=c;
            if(q==1)
            {
                while (!feof(fp1))
                {
 
                    for(l=0; l<6; l++)
                   {
                      fread(&x,sizeof(char),1,fp1);
                      st[l]=x;
                      printf("%c ", st[l]);
                    }
                    if((st[0]==d[0]) && (st[1]==d[1]))
                    {
         
                        fputc(st[3], fp2);
                        fputc(st[4], fp2);
                    }
                }
            }
        }
    }
}
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.03.2013, 20:21     почему PRINTF не работает? #17
Цитата Сообщение от Kr Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while (!feof(fp1))
* * * * * * * * {
for(l=0; l<6; l++)
* * * * * * * * * *{
* * * * * * * * * * * fread(&x,sizeof(char),1,fp1);
* * * * * * * * * * * st[l]=x;
* * * * * * * * * * * printf("%c ", st[l]);
* * * * * * * * * * }
* * * * * * * * * * if((st[0]==d[0]) && (st[1]==d[1]))
* * * * * * * * * * {
fputc(st[3], fp2);
* * * * * * * * * * * * fputc(st[4], fp2);
* * * * * * * * * * }
* * * * * * * * }
Данный цикл сможет отработать только один раз, после чего указатель в файле переместится в конец и выставится индикатор конца файла.
Цитата Сообщение от Kr Посмотреть сообщение
for(q=0; q<2; q++)
Вообще не очень хорошо считывать из файла не заботясь о том, а считалось ли вообще что-то. А если в файле окажется нечетное число символов?
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 20:46  [ТС]     почему PRINTF не работает? #18
почему только 1 раз???
а как тогда сделать чтобы он из fp считывал дальше, а не переходил на конец файла??? я так понимала, что while(!feof(fp)) сам как бы проходит дальше пока не закончится
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2013, 20:52     почему PRINTF не работает?
Еще ссылки по теме:

C++ Не работает printf в VS 2008
Почему функция printf несовместима с функцией AllocConsole? C++
C++ Почему не выводит printf?

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

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.03.2013, 20:52     почему PRINTF не работает? #19
Это цикл чтения fp1, а не fp. Сделайте вызов перед циклом
C++
1
rewind(fp1);
Yandex
Объявления
16.03.2013, 20:52     почему PRINTF не работает?
Ответ Создать тему
Опции темы

Текущее время: 10:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru