Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема с отображением текста в CStatic / 18 сообщений из 18, страница 1 из 1
14.05.2006, 11:51
    #33725100
AxNe0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
Всем привет! Имеется проблема :)
Функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
char * o_file(char *filename)
{
char *result="";
FILE *f;
f = fopen(filename, "r");
if (f!=  0  )
{
char ch;
fseek(f,  0 , SEEK_SET);
while (!feof(f) && ch != '\n' &&  ch != '\r')
{
ch = fgetc(f);
if ( ch != '\n' &&  ch != '\r' && !feof(f)) result+=ch;
};
return(result);
}
else 
{
AfxMessageBox("Error: File not found",MB_OK | MB_ICONSTOP, 0 );
return("Error: File not found");
};
fclose(f);
};
Вызывается при создании CStatic:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CMainWnd::CMainWnd()
{
CRect rcwin( 20 , 10 , 420 , 60 ), rcstat( 30 , 10 , 110 , 70 );
Create(NULL, "Test program" , WS_CAPTION  | WS_SYSMENU  | SBS_SIZEBOX,rcwin, NULL,NULL);
MyStatic = new CStatic();
if (MyStatic!=NULL) MyStatic-> Create(o_file(filename),WS_CHILD|WS_VISIBLE|SS_CEN
TER, rcstat,this);
};
Но не работает так, как хотелось бы. Вместо латинских букв на CStatic появляется что-то вроде:
Этой картинки :(
Как можно поправить ситуацию?
ЗЫ Большая просьба - ответы пояснять кодом, а код - по мере возможности, подробными пояснениями...
...
Рейтинг: 0 / 0
15.05.2006, 00:22
    #33725779
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
Код: plaintext
1.
2.
3.
4.
char *result="";
...
result+=ch;


- Это просто классно !! Даже работать будет !!! Вот только что же получится ...
...
Рейтинг: 0 / 0
15.05.2006, 01:22
    #33725816
AxNe0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
Уважаемый, MasterZiv!
Очень обидно, что в таком замечательном городе, каковым является СПб, живут такие люди как вы, которые вместо того, чтобы помочь попавшему в затруднение человеку, оставляют подобные сообщения, никак не проясняющие решение проблемы. Иными словами, если не можете ничем помочь, то молчите себе спокойно в тряпочку и не показывайте всем уровень вашего интеллекта и уважения к людям, начавшим изучение Си.
...
Рейтинг: 0 / 0
15.05.2006, 09:50
    #33726126
А. К
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//1
//char *result="";
static char *result="";

//2

//result+=ch
strcat( result, ch);


Попробуй.
...
Рейтинг: 0 / 0
15.05.2006, 09:56
    #33726138
Homosum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
AxNe0Всем привет! Имеется проблема :)
Функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
char * o_file(char *filename)
{
char *result="";
FILE *f;
f = fopen(filename, "r");
if (f!=  0  )
{
char ch;
fseek(f,  0 , SEEK_SET);
while (!feof(f) && ch != '\n' &&  ch != '\r')
{
ch = fgetc(f);
if ( ch != '\n' &&  ch != '\r' && !feof(f)) result+=ch;
};
return(result);
}
else 
{
AfxMessageBox("Error: File not found",MB_OK | MB_ICONSTOP, 0 );
return("Error: File not found");
};
fclose(f);
};
Вызывается при создании CStatic:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CMainWnd::CMainWnd()
{
CRect rcwin( 20 , 10 , 420 , 60 ), rcstat( 30 , 10 , 110 , 70 );
Create(NULL, "Test program" , WS_CAPTION  | WS_SYSMENU  | SBS_SIZEBOX,rcwin, NULL,NULL);
MyStatic = new CStatic();
if (MyStatic!=NULL) MyStatic-> Create(o_file(filename),WS_CHILD|WS_VISIBLE|SS_CEN
TER, rcstat,this);
};
Но не работает так, как хотелось бы. Вместо латинских букв на CStatic появляется что-то вроде:
Этой картинки :(
Как можно поправить ситуацию?
ЗЫ Большая просьба - ответы пояснять кодом, а код - по мере возможности, подробными пояснениями...


Маленький нюанс с функцией o_file. Если я не ошибась, при открытия файла и считывания символов, вы возвращаете результати выходите из функции, но при этом забываете закрыть файл, а это не есть хорошо.
...
Рейтинг: 0 / 0
15.05.2006, 12:37
    #33726738
AxNe0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
Всем спасибо! :) Решение найдено в следующем виде:
Код: plaintext
1.
2.
3.
4.
//char *result="";
char result=new char[];

//result+=ch
result[i]=ch;

HomosumМаленький нюанс с функцией o_file. Если я не ошибась, при открытия файла и считывания символов, вы возвращаете результат и выходите из функции, но при этом забываете закрыть файл, а это не есть хорошо.
Насколько я понимаю работу функций - они выполняются пока не закончится код либо пока не попадется прерывания. Прерываний в функции нет, поэтому, весь код выполняется, потом закрывается файл и выход из функции. Или может return играет роль прерывателя?
...
Рейтинг: 0 / 0
15.05.2006, 13:59
    #33727110
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
AxNe0Очень обидно, что в таком ...

Я не могу по ИНету учить людей языку С++ (увы), он очень большой, сложный и объемный. Человек (ой, это же ты, да ?) не понимает элементарного, если он САМ это не выучит -- не будет понимать никогда. Когда дейтвительно по делу вопросы - всегда помогаю. К тому же я тоже человек, а человеку свойственно выражать свои эмоции, такие как радость, удивление, и прочее. Я например был реально удивлен, что ТАК можно написать и что это даже будет компилироваться.

Кстати, данный форум я рассматриваю не более как треп на тему возле с++ winapi и , как не странно, дельфы.
...
Рейтинг: 0 / 0
15.05.2006, 14:01
    #33727120
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
AxNe0Всем спасибо! :) Решение найдено в следующем виде:
Код: plaintext
1.
2.
3.
4.
//char *result="";
char result=new char[];

//result+=ch
result[i]=ch;



Какое же это решение , если это даже компилироваться не будет. Надо же
указывать размер массива.
...
Рейтинг: 0 / 0
15.05.2006, 14:37
    #33727305
Homosum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
AxNe0Всем спасибо! :) Решение найдено в следующем виде:
Код: plaintext
1.
2.
3.
4.
//char *result="";
char result=new char[];

//result+=ch
result[i]=ch;

HomosumМаленький нюанс с функцией o_file. Если я не ошибась, при открытия файла и считывания символов, вы возвращаете результат и выходите из функции, но при этом забываете закрыть файл, а это не есть хорошо.
Насколько я понимаю работу функций - они выполняются пока не закончится код либо пока не попадется прерывания. Прерываний в функции нет, поэтому, весь код выполняется, потом закрывается файл и выход из функции. Или может return играет роль прерывателя?

return не совсем прерыватель (хотя код именно прерывает:)), это точка выхода из функции, соответственно весь код, который идет после return выполняться не будет.
...
Рейтинг: 0 / 0
15.05.2006, 14:51
    #33727393
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
Код: plaintext
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.
#include <stdio.h>
#include <string>
#include <fstream>
 
const char * o_file(const char *filename);
const std::string e_file(const char *filename);
const std::string yes_file(const char *filename);

int main() 
{
  const char *p = o_file("c:\\tmp\\q.txt");
  printf( "Value is [%s]\n", p );

  const std::string res = e_file("c:\\tmp\\q.txt");
  printf( "Value is [%s]\n", &res[ 0 ] );

  const std::string res1 = yes_file("c:\\tmp\\q.txt");
  printf( "Value is [%s]\n", &res1[ 0 ] );

  return  0 ;
}

const char * o_file(const char *filename)
{
  char *result = "";
  FILE *f = fopen(filename, "r");
  if( f != NULL )
  {
    char ch;
    fseek(f,  0 , SEEK_SET);
    while( !feof(f) && ch != '\n' &&  ch != '\r' )
    {
      ch = fgetc(f);
      if ( ch != '\n' &&  ch != '\r' && !feof(f)) result+=ch;
    };
    fclose(f);
    return(result);
  }
  else 
    return NULL;
}

const std::string e_file(const char *filename)
{
  FILE *f = fopen(filename, "r");
  if( f != NULL )
  {
    std::string result;
    //fseek(f, 0, SEEK_SET); // ýòî íå íóæíî, ïîñêîëüêó ôàéë òîëüêî ÷òî îòêðûò
    while( !feof(f) )
    {
      int ch = fgetc(f);
      if( ch == '\n' ||  ch == '\r' )
        break;
      result += ch;
    };
    fclose(f);
    return result;
  }
  else 
    return std::string();
}
    
const std::string yes_file(const char *filename)
{
  std::ifstream f( filename );
  if( !f )
    return std::string();
  else 
  {
    std::string res;
    std::getline(f,res);
    return res;
  }
}

...
Рейтинг: 0 / 0
15.05.2006, 14:58
    #33727451
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
чел, а ну быстро сел читать про управление памятью и области видимости переменных.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
15.05.2006, 15:03
    #33727484
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
printf( "Value is [%s]\n", p ); <-- вот тут можно access violation схлопотать
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
16.05.2006, 00:45
    #33728696
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
maXmoprintf( "Value is [%s]\n", p ); <-- вот тут можно access violation схлопотать


Так это неправильный вариант. Конечно можно.
...
Рейтинг: 0 / 0
18.05.2006, 17:43
    #33736563
AxNe0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
Не знаю, на самом деле, код функции с этими исправлениями
Код: plaintext
1.
char result=new char[];
result[i]=ch;
компилируется, и даже работает, только почему-то не всегда. К сожалению, не могу понять, почему?.. :(
...
Рейтинг: 0 / 0
18.05.2006, 17:50
    #33736589
Dmitrii K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
AxNe0Не знаю, на самом деле, код функции с этими исправлениями
Код: plaintext
1.
char result=new char[];
result[i]=ch;
компилируется, и даже работает, только почему-то не всегда. К сожалению, не могу понять, почему?.. :(
При выделении памяти при помощи оператора new необходимо указать размер выделяемого блока памяти. А чтобы работало всё корректно, не следует выходить за рамки установленного размера массива, иначе по AV вылетит...
...
Рейтинг: 0 / 0
18.05.2006, 20:10
    #33736932
AxNe0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
а динамический массив никак не создать, если неизвестна длина строки?
...
Рейтинг: 0 / 0
18.05.2006, 20:43
    #33736970
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
Аятебе что написал ? Нидинамичиски что ли ?
...
Рейтинг: 0 / 0
19.05.2006, 00:36
    #33737183
AxNe0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с отображением текста в CStatic
MasterZiv , а вот не работают твои функции :(
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема с отображением текста в CStatic / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]