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

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

Войти
Регистрация
Восстановить пароль
 
 
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
#1

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

15.03.2013, 23:47. Просмотров 1136. Ответов 18
Метки нет (Все метки)

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

почему не работает printf? С++ - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; void main() { int colPos, rowPos; int i, j, k, razm; ...

Почему не выводит printf? - C++
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;math.h&quot; #include &quot;locale.h&quot; using namespace std; void main() { ...

Почему используется printf, а не cout? - C++
#include &lt;iostream.h&gt; void main() { printf(&quot;hello world&quot;); } почему void main() а не main(),почему printf а не cout...

Почему printf не видит некоторые аргументы? - C++
программа на с++, но для ограничения числа знаков после запятой использовала printf. #include &lt;iostream.h&gt; #include &lt;stdlib.h&gt; ...

Почему функция printf несовместима с функцией AllocConsole? - C++
То есть ситуация: процесс x создаёт процесс y (x-&gt;y), в y для создания консоли используется функция AllocConsole, консоль создаётся, но в...

Printf не работает - C++
Здравствуйте. В такой вот, пародии на программку последний printf ничего не выводит. Только начал изучать C++. Подкажите в чём может быть...

18
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1722 / 1265 / 344
Регистрация: 12.01.2011
Сообщений: 5,028
16.03.2013, 00:03 #2
C++
1
2
*/ В место этого 
printf("%c ", st[l]);
Добавлено через 2 минуты
тьфу я же не хотел что бы оно отослалось. Извеняюсь
C++
1
2
cout 
попробуйте в место printf
0
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 00:13  [ТС] #3
а какая разница??
попробовала, все равно ничего не выводится на экран

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

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

где a[n] ="%c%c\0"
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,631
16.03.2013, 00:21 #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;
}
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.03.2013, 01:32 #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;
}
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
16.03.2013, 01:36 #6
Kr, а файл вообще открывается? Вы проверку открытия файла делаете?
0
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 13:56  [ТС] #7
файл открывается да.

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

C
1
2
3
4
5
6
fp1=fopen(file,"r+"); //r+ прочитала что вроде как и чтение и запись, нет???
  if (fp1==NULL)
  {
     printf("Nevozmozhno sozdat file!\n");
     return 1;
  }
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
16.03.2013, 14:30 #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);
которая возвращает текущее положение файлового указателя.
1
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 15:02  [ТС] #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);
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
16.03.2013, 15:21 #12
Цитата Сообщение от Kr Посмотреть сообщение
так можно???
так можно. Попробуйте еще после окончания записи такую функцию
C
1
clearerr(fp1);
1
Kr
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 35
16.03.2013, 15:36  [ТС] #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 взятых с потолка символа, и каждый раз они одни и те же!

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

Не по теме:

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

Размер: 7.2 Кб

1
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
16.03.2013, 16:12 #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.
Как сие безобразие понимать?
1
16.03.2013, 16:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2013, 16:12
Привет! Вот еще темы с ответами:

Не работает printf в VS 2008 - C++
Здравствуйте . Написал несколько небольших проектов на С в VS2008 ,и нигде в окне не выводится результат, хотя компилятор пишет ошибок...

Не работает printf без \n в цикле for - C++
Вообще задача: выводить процент завершения процесса без перехода на новую строку и без мигания курсора. В одной функции в цикле while...

Тупо не работает функция printf... - C++
BCB 5.0 нормально программу компилирует и выполняет - никаких ошибок нет - а сообщение через функцию printf на принтер не выходит......

Не работает программа через printf и scanf - C++
Нужно написать программу, которая бы выводила таблицу через printf и scanf, которые бы находились в циклах и данные заносились бы в массивы...


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

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

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