ВИУ5-61

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



C++

Сообщений 1 страница 20 из 20

1

Подскажите кто-нибудь почему вот такие ошибки. Что с этим делать?
Набрала:
#include <stdio.h>
#include <conio.h>
void asa(void)
{
getch();
}

Ошибка:
1>------ Build started: Project: as, Configuration: Debug Win32 ------
1>Linking...
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
1>C:\Documents and Settings\User\Рабочий стол\C++\as\Debug\as.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Documents and Settings\User\Рабочий стол\C++\as\as\Debug\BuildLog.htm"
1>as - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Отредактировано Ольга (2009-09-30 00:06:55)

0

2

вместо

Ольга написал(а):

void asa(void)
{
getch();
}

надо
void main(void)
{
getch();
}
P.S: main() - точка входа. Всегда должна быть в любой программе на С,С++

0

3

Привет!
Вопрос по программе. Допустим, я использую функцию scanf в формате %d для int. Как сделать проверку на несоответствие формата. То есть я введу букву, например, и хочу вывести предупреждение с printf. Так как ввод подразумевается не один раз, то проверка на число в цикле, а на введение чего-нибудь другого он зацикливается. Может есть смысл изначально сделать ввод в char или string типе? Но не знаю как потом к Int вернуться. Подскажите....)

0

4

я за основу взяла наш файл f57 по сравнению строк... не оптимально, зато просто.. имхо....
ЗЫ: а как сделать красиво и правильно??? я как-то тоже на цикл пришла или вложенный if... по-другому не придумалось(((

0

5

Ольга написал(а):

Но не знаю как потом к Int вернуться. Подскажите....)

Конвертация Int в Char:

int integer;
char character;

character = (char) integer;

Конвертация Char в Int:

int integer;
char character;

integer = (int) character;

или через штатную библиотечную функцию atoi:

char character;

int atoi(character);

А применительно к твоей проблеме с зацикливанием при выборе пункта (символ вместо числа) можно сделать так:

int numb; //номер выбранного пункта
char numb_str[11]; //массив длиной 11 символов (11 выбрано для того, чтобы 1 символ оставить на перенос строки, 10 на
                                      //ввод данных)

scanf("%10s", numb_str); //длина вводимой строки будетмаксимум 10 символов
fflush(stdin); //очищаем входной поток, чтобы не было ошибок при вводе строк длиной более 10 символов (если введем 11
                   //символов q, например, то сообщение о неправильно введенном пункте выскочит 2 раза, т.е. 1 лишний символ так и
                   //останется во входном потоке и при следующем scanf будет читаться
numb = atoi(numb_str); //конвертируем номер пункта в формат int из формата char

Отредактировано RAE (2009-10-28 14:12:22)

0

6

Всем большое спасибо!!!

0

7

Привет!
Подскажите мне. Создала я стуктуру, заполнила, вывела в файл. И все это в одном из заголовочных файлов(input). С чтением из файла понятно. А как мне в массив записать все это и чтобы им можно было оперировать везде..я в тупике...(

0

8

создаешь массив нужного размера, копируешь в него считанные данные из файла. Если хочешь пример - то давай код.

0

9

Артем, привет, тот же вопрос: подскажи плз как из файла.txt читать  в массив....
Код ниже... (мусора много, т.к. это тест)
буду признательна.... спб
+++++++BEGIN+++
/*БД ВЕКСЕЛЯ
ввод данных
запись в файл
чтение из файла (может читать c пробелами)
поиск строки по номеру векселя*/

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <cmath>
#include <string.h>
#include<fstream>
#define KEY_ESC 0x1b
#define KEY_ENTER 0x0d//0x0d тоже что и 0xd (без d)

using namespace std;

//-------------------------
int main()

{ SetConsoleCP(1251);
SetConsoleOutputCP(1251);

//---------Ввод данных и помещение в файл
char number[5][10];//имя_массив[строки-6][длина строки массива]: массив номеров векселей
char name_vdat[5][15];//массив наименований векселедателей
char name_vder[5][15];//массив наименований векселедержателей
char sdata[5][9];//массив дат составления
char sum[5][15];//массив номиналов

int t,s;//переменные для ввода данных по векселям
cout<<"Введите количество записей, которое Вы хотите ввести: ";
cin>>s;

char a[10],b[15],c[15],d[10],e[15];//номер векселя, Векселедатель, Векселедержатель, дата составления, номинал

ofstream out("test.txt");
if(!out)
{
    cout<<"не могу создать файл.\n";
    return 1;
}

for(t=0;t<s;++t)
{
    //номер векселя
    cout<<"\nВведите номер векселя: ";
    cin>>a;
    strcpy(number[t],a);
    //cout<<"Номер векселя[ "<<t<<" ]: "<<number[t]<<"\n";
    out<<number[t]<<"\t";

    //Векселедеатель
    cout<<"Введите наименование Векселедателя: ";
    cin>>b;
    strcpy(name_vdat[t],b);
    //cout<<"Векселедатель[ "<<t<<" ]: "<<name_vdat[t]<<"\n";
    out<<name_vdat[t]<<"\t";

    //Векселедержатель
    cout<<"Введите наименование Векселедержателя: ";
    cin>>c;
    strcpy(name_vder[t],c);
    //cout<<"Векселедержатель[ "<<t<<" ]: "<<name_vder[t]<<"\n";
    out<<name_vder[t]<<"\t";

    //Дата составления
    cout<<"Введите дату составления векселя в формате ДД.ММ.ГГ: ";
    cin>>d;
    strcpy(sdata[t],d);
    //cout<<"Дата составления[ "<<t<<" ]: "<<sdata[t]<<"\n";
    out<<sdata[t]<<"\t";

    //Номинал
    cout<<"Введите номинал векселя (цифры вводятся без точек, пробелов и копеек): ";
    cin>>e;
    strcpy(sum[t],e);
    //cout<<"Номинал векселя[ "<<t<<" ]: "<<sum[t]<<"\n\n";
    out<<sum[t]<<"\n";
   
}
out.close();
//--------------чтение массива просто так, для проверки
for(t=0;t<s;++t)
{
    //номер векселя
    cout<<"[ "<<t<<" ]:"<<number[t]<<"\t";
   
    //Векселедеатель
    cout<<" [ "<<t<<" ]:"<<name_vdat[t]<<"\t";

    //Векселедержатель
    cout<<" [ "<<t<<" ]: "<<name_vder[t]<<"\t";

    //Дата составления
    cout<<" [ "<<t<<" ]: "<<sdata[t]<<"\t";

    //Номинал
    cout<<" [ "<<t<<" ]: "<<sum[t]<<"\n";
}

//------------чтение из файла

char ch;
ifstream in("test.txt",ios::in | ios::binary);
if(!in)
{
    cout<<"не могу открыть файл.\n";
    return 1;
}
while(in)
{
    //in будет false когда достигнут eof
    in.get(ch);
    if(in) cout<<ch;
}
in.close();

//-----Поиск нужного эелемента
find:
char num1,z,w='Y';
char str[10],nov[15];
int i;

cout<<"Выберите один из следующих параметром для осуществления поиска из заданной выборки:\n";
cout<< "\n A. Номер векселя";
cout<< "\n B. Векселедатель";
cout<< "\n C. Векселедержатель";
cout<< "\n D. Дата составления векселя (формат ДД.ММ.ГГ)";
cout<< "\n E. Номинал векселя";
cout<< "\n **********************************************";
cout<< "\n Введите соответствующую выбранному пункту букву латинского алфавита: ";
cin>>num1;

switch(num1)
{
    case 'A':   
    cout<<"\nВведите номер векселя для поиска данных по векселю: ";
    cin>>str;
    for(i=0;i<t;i++)
    {   if(!strcmp(str,number[i]))
        {
        cout<<"искомая строка: "<<number[i]<<"\t"<<name_vdat[i]<<"\t"<<name_vder[i]<<"\t"<<sdata[i]<<"\t"<<sum[i]<<"\n";
        cout<<"\nВведите новый номер векселя: ";//меняем ранее введенные данные
        cin>>nov;
        strcpy(number[i],nov);
        cout<<"измененная строка: "<<number[i]<<"\t"<<name_vdat[i]<<"\t"<<name_vder[i]<<"\t"<<sdata[i]<<"\t"<<sum[i]<<"\n";
        break;
        }
        if(i==t) cout<<"Не найдено.\n";
    }
    break;

    case 'B':
    cout<<"\nВведите наименование Векселедателя для поиска данных по векселю: ";
    cin>>str;
    for(i=0;i<t;i++)
    {   if(!strcmp(str,name_vdat[i]))
        {
        cout<<"искомая строка: "<<number[i]<<"\t"<<name_vdat[i]<<"\t"<<name_vder[i]<<"\t"<<sdata[i]<<"\t"<<sum[i]<<"\n";
        break;
        }
        if(i==t) cout<<"Не найдено.\n";
    }
    break;

    case 'C':
    cout<<"\nВведите наименование Векселедержателя для поиска данных по векселю: ";
    cin>>str;
    for(i=0;i<t;i++)
    {   if(!strcmp(str,name_vder[i]))
        {
        cout<<"искомая строка: "<<number[i]<<"\t"<<name_vdat[i]<<"\t"<<name_vder[i]<<"\t"<<sdata[i]<<"\t"<<sum[i]<<"\n";
        break;
        }
        if(i==t) cout<<"Не найдено.\n";
    }
    break;

    case 'D':
    cout<<"\nВведите Дату составления в формате ДД.ММ.ГГ для поиска данных по векселю: ";
    cin>>str;
    for(i=0;i<t;i++)
    {   if(!strcmp(str,sdata[i]))
        {
        cout<<"искомая строка: "<<number[i]<<"\t"<<name_vdat[i]<<"\t"<<name_vder[i]<<"\t"<<sdata[i]<<"\t"<<sum[i]<<"\n";
        break;
        }
        if(i==t) cout<<"Не найдено.\n";
    }
    break;

    case 'E':
    cout<<"\nВведите номинал для поиска данных по векселю: ";
    cin>>str;
    for(i=0;i<t;i++)
    {   if(!strcmp(str,sum[i]))
        {
        cout<<"искомая строка: "<<number[i]<<"\t"<<name_vdat[i]<<"\t"<<name_vder[i]<<"\t"<<sdata[i]<<"\t"<<sum[i]<<"\n";
        break;
        }
        if(i==t) cout<<"Не найдено.\n";
    }
    break;

    default:
    cout<<"Вы можете вводить только предопределенные пункты меню: A, B, C, D, E.\n";
    cout<<"Хотите продолжить поиск (Y/N)?";
    cin>>z;
    if(z==w) goto find;
    else return 1;
    }
cout<<"Хотите продолжить поиск (Y/N)?";
cin>>z;
if(z==w) goto find;

getch();
}
===============END===================

0

10

Марина, все чем могу помочь по этому поводу.Не знаю как ты хочешь, но я вижу это так. Если тебе надо не все целиком, то надо доп условие до разделителя и в цикл. Артему пиши на почту, он форум не проверяет.
//чтение из файла в массив-буфер для дальнейшего поиска..
char buf[512];
DWORD m;
int i;
i=0;
HANDLE hF;
fflush(stdin);
hF=CreateFile("01.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
while (true)
{ char s;
ReadFile(hF,&s,1,&m,NULL);
if (m==0) break;
else {
    printf("%c",s);*(buf+i++)=s;\\текущий прочитанный символ из файла запоминаем в массив. (Инкремент элементов и посимвольная запись)
}}
buf[i]='\0';//обрезка массива, обязательно!
printf("%s",buf);//проверочный вывод массива

0

11

привет,
я сейчас файл использую только как "принтер\сканер"..
т.е. при вводе у меня все в строчные массивы помещается, которые связаны по индексу.. и по ходу программы я с массивами и работаю...
вопрос в ином.. если там есть какие-то данные (левые, введенные не в программе), как их в массив (структуру) поместить???... и надо ли на это заморачиваться....

0

12

Я с Артемом поговорила и он посоветовал через файл все делать. Я так и решила. Действительно, если бд большая, то слишком много памяти занимать будет. Твой пример мне  мало понятен, уж очень ты в потоки ударилась, мы их и не изучали. А вообще круто очень у тебя! По поводу вопроса..если мне надо было бы так делать, то есть два варианта:
1) заполнять структуру прям из файла средствами ReadFile. Но при условии что структура левого файла эквивалентна структуре массивов и постоянный разделитель. Читаешь символы до ближайшего разделителя, заносишь в нужный элемент...и так далее все в цикле.
2) Если пугают файлы, то все скидываешь в буфер(вместе с разделителями и переводами строк) и там аналогично ваяешь.
Написать это можно, но придется все продумать и протестировать не один раз. Так что сама решай, как тебе лучше. Удачи!)

0

13

да не... сижу по учебнику "2+2" сложить не могу... + версия 2008 несколько отличается...(((
лана буду разбираться... чтение файла в массив отложу на "сладкое"...
спсб...
ЗЫ: а как  символ табуляции найти в тексте???? а еще символ конца строки... (в смысле как они обозначаются)
спсб...

0

14

Kss
1) чтобы не было левых данный - массив надо объявлять так:

Код:
char arr[50] = {'\0'};

или так

Код:
char arr[50];
memset(arr,0,strlen(arr));

2) Данные из файла можно считывать по разному, смотря в каком формате они хранятся в файле и с помощью каких функций считывать данные. Я пользовался ReadFile().
Посмотри в примере, который Я присылал где производится чтение из файла есть этот алгоритм.
Суть в том, что тебе нужно пройтись по каждой записи (записывая каждый ее символ во временный буфер) и как только ты доходишь до символа возврата каретки (это код '\x0d') или до символа перевода строки (это код '\x0a') то тебе нужно этот временный буфер добавить  в другой массив большего размера (с помощью strcat) и продолжать перебирать записи дальше по точно такому же алгоритму. Как только дошла до конца файла - можешь вывести на экран полученный массив (это который большего размера). Это если ты хочешь с помощью ReadFile() делать, насколько Я помну ты использовала потоки, Я с ними давно уже не работал, но по-моему с ними можно проще реализовать т.к там есть функция, которая считывает всю строку в файле за раз.
P.S: Я могу потом при встрече подробней рассказать как это все делается, просто решить эту задачу можно как минимум пятью способами. Скажу сразу мой способ не есть самый простой и компактный.

0

15

Как сделать запись в файл, если для ввода данных использовалась структура (как давал Деон) и ввод данных идет в одном куске программы
input.h

КОД:

struct sHard
{
char Model[30];
char Processor[50];
char Motherboard[20];
char OZY [10];
char HDD [10];
char Privod [10];
char Price[10]; //можно ли сделать float
};

sHard Server[150];

for (int i=0;i<m;i++)
    {
    fflush(stdin);//очищение потока
    printf ("\nМодель: "); gets(Server[i].Model);
    printf ("\nПроцессор: "); gets(Server[i].Processor);
    printf ("\nМатеринская плата: "); gets(Server[i].Motherboard);
    printf ("\nОЗУ: "); gets(Server[i].OZY);
    printf ("\nЖесткий диск: "); gets(Server[i].HDD);
    printf ("\nОптический привод: "); gets(Server[i].Privod);
    printf ("\nЦена:"); gets(Server[i].Price);
    printf ("\n---------------------------\n\n");
    }

далее отсюда следует переход в программу блок программы write.h, где создается файл

КОД:

HANDLE hF;//тип структуры для обобщенного указателя

hF=CreateFile("DB_server.xls",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

как записать полученные данные в структуре в этот файл?
функцией WriteFile?
какие у нее должны быть атрибуты?
нужно ли использовать массив и как перейти от стуктуры к массиву?
или можно дальше также пользоваться структурой?
можно ли записать данные в файл Excel (создать мне его удалось:))

0

16

Настя, привет.

anushkina написал(а):

можно ли записать данные в файл Excel (создать мне его удалось:))

С этим я протестировала на своей, все ложится идеально- по полям. В качестве разделителя у меня табуляция <\t>.

anushkina написал(а):

далее отсюда следует переход в программу блок программы write.h, где создается файл

Вот с этим проблема такая. Чтобы тебе записать структуру в другом блоке программы, структура должна быть в соответствующей видимости. С этим я не практиковалась. Я записала в том же блоке в файл(как хранилище бд). А в блоке "запись" предложила пользователю либо записать копию бд в нужный файл(имя и расширение вводит пользователь), либо перезатирает хранилище и записывает в него данные из другого источника(имя вводится аналогично).

anushkina написал(а):

функцией WriteFile?
какие у нее должны быть атрибуты?

С атрибутами ничего не меняем.

anushkina написал(а):

нужно ли использовать массив и как перейти от стуктуры к массиву?

Можно все что угодно, но надо знать как это сделать. ) Я про хранилище писала, так вот непосредственно через него все и завязала. Используешь ReadFile и линкуешь посимвольно в нужные элементы данных.
Вот мои куски:
////ввод структуры и запись хранилища
for (int i=0;i<rez_str;i++)
{ fflush(stdin);
    printf("Название_торговой_точки="); gets(s[i].Abvr_name);
    printf("Номер_карты="); gets(s[i].Card_num);
    printf("Сумма_транзакции="); gets(s[i].Tran_amt);
    printf("Город="); gets(s[i].City);
    printf("Номер_оборудования="); gets(s[i].TermID);
    printf("Платежная_система="); gets(s[i].Psyst);
    printf("\n");}
printf("_________________________________________________________________________\n");
hF=CreateFile("01.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);
for (int k=0;k<rez_str;k++)
{WriteFile(hF,s[k].Abvr_name,strlen(s[k].Abvr_name),& m,NULL);
WriteFile(hF,strcat(s[k].Card_num,"\t"),strlen(s[k].Card_num)+1,& m,NULL);
WriteFile(hF,strcat(s[k].Tran_amt,"\t"),strlen(s[k].Tran_amt)+1,& m,NULL);
WriteFile(hF,strcat(s[k].City,"\t"),strlen(s[k].City)+1,& m,NULL);
WriteFile(hF,strcat(s[k].TermID,"\t"),strlen(s[k].TermID)+1,& m,NULL);
WriteFile(hF,s[k].Psyst,strlen(s[k].Psyst),& m,NULL);
WriteFile(hF,"\r\n",2,&m,NULL);}
CloseHandle(hF);
printf("\nХотите выполнить другую операцию?\n(да-1,нет-0):");
return fprov_y_n();
/////пункт запись(CopyFile("01.txt", name, FALSE); "01.txt"-откуда, name-куда, если в name что-то было-затирается )
#include "proverka_3.h"
int fwrite(void)
{
char name[20];
int ans;
fflush(stdin);
printf("\n1)Записать копию хранилища в файл;\n2)Импортировать в бд данные другого источника;\nВыберите действие(копия бд-1,файловый импорт-2,выйти-3):");
ans=fprov_3();
if (ans==1) {
printf("\nВведите имя файла с расширением:"); gets(name);
CopyFile("01.txt", name, FALSE);
printf("Информация записана в файл %s .",name); }
if (ans==2) {
printf("\nВведите имя файла с расширением:"); gets(name);
CopyFile(name, "01.txt", FALSE);
printf("Информация записана из файла %s записана в хранилище.",name); }
if (ans==3) printf("Хотите выйти из меню или программы?\n(из меню-1,из программы-0):");
else printf("\nХотите выполнить другую операцию?\n(да-1,нет-0):");
return fprov_y_n();
}

Все что знаю по этому поводу.))

0

17

Подскажите...
Не получается замену символов в цикл сделать.  Если логику цикла вывести поэлементно, то заменяет. Длины строки и прочее все проверила. Кто-нибудь сталкивался с подобным?

char *p=&(*strstr(buf,izm));

//for (i=0;(strlen(izm1)-1);i++)
//{*(p+i)=izm1[i];}

*(p+0)=izm1[0];
*(p+1)=izm1[1];
*(p+2)=izm1[2];

0

18

а это так и должно быть что  здесь
char *p=&(*strstr(buf,izm));
а здесь
//for (i=0;(strlen(izm1)-1);i++)
//{*(p+i)=izm1[i];}

Отредактировано Тема (2009-11-08 18:03:36)

0

19

Вопрос снят. В цикле не написала условие на i. Он был бесконечным. Артем, спасибо!
//for (i=0;i!=strlen(izm1);i++)

Отредактировано Ольга (2009-11-08 19:04:34)

0

20

anushkina
запись структуры в файл осуществляется точно также как и массива:

struct sHard
{
   char Model[30];
   char Processor[50];
   char Motherboard[20];
   char OZY [10];
   char HDD [10];
   char Privod [10];
   char Price[10];
};

sHard Server[150];

for(int y = 0; y<150; y++)
{
    WriteFile(hF,Server[y].Model,sizeof(Server[y].Model),&m,NULL);
    WriteFile(Server[y].Processor,sizeof(Server[y].Processor),&m,NULL);
    WriteFile(Server[y].Motherboard,sizeof(Server[y].Motherboard),&m,NULL);
    WriteFile(Server[y].OZY,sizeof(Server[y].OZY),&m,NULL);
    WriteFile(Server[y].HDD,sizeof(Server[y].HDD),&m,NULL);
    WriteFile(Server[y].Privod,sizeof(Server[y].Privod),&m,NULL);
    WriteFile(Server[y].Price,sizeof(Server[y].Price),&m,NULL);

}

Только нужно еще после каждой записи пописывать символ разделитель (\t или \n )

0