не компилится..

Тема в разделе "WASM.BEGINNERS", создана пользователем Nok, 9 окт 2008.

  1. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    товагесчи, не компилиццо..
    код реализует кодировку алгоритмом Цезаря..
    код, вроде норм..(имхо, не забейте камнями)
    эррор таков:
    [Linker Error] Unresolved external '_Form1' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\PROJECT1.OBJ
    [Linker Error] Unresolved external 'TForm1::' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\PROJECT1.OBJ


    #include<iostream>
    #include<windows.h>
    using namespace std;

    int main(int argc, char* argv[]){

    int letter,i,m;
    int var=9;//сдвиг
    char* str=new char[10000];
    FILE *fin=fopen (argv [1], "r");//ввод из командной строки названия файла, "1.txt"

    while(!feof(fin))
    { m=0;
    str[m++]=(char)fgetc(fin);

    }
    fclose(fin);
    str[--m]='\0';
    if(stricmp(argv [2],"-e")==0){ //необходимый параметр, в будущем планируется декодировка
    //далее алгоритм Цезаря, но..может быть лучше через функцию выполнить?//
    for(i = 0;i<m;i++)
    {
    str =+ var;

    FILE* fout = fopen( argv [3],"w");//ввод из командной строки
    //синтаксис таков: "1.txt -e 2.txt"
    fprintf(fout,"%s \n",str);
    fclose(fout); }
    }
    delete []str ;
    return 0;
    }
     
  2. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Код (Text):
    1. while(!feof(fin))
    2. {        m=0;
    3.     str[m++]=(char)fgetc(fin);
    4.  
    5. }
    жесть. по выходу из тела этого цикла у тебя m будет равняться 1, а в массиве str будет лежать лишь str[0] элемент, равный последнему введенному символу с консоли. все остальные его 10000-1 элементы будут непроинициализированные.

    это раз.

    а два -- это то, что у тебя размерность буфера str фиксированная. какие у тебя гарантии, что указанный с консоли файл будет содержать НЕ БОЛЬШЕ 10000 байт?

    три -- не проверяешь new. может вылететь std::bad_alloc.

    четыре -- та же fopen может вернуть NULL не открыв файл. у тебя проверки нету.

    это при поверхностно взгляде на код. более детально не глядел, т.ч. могут быть еще недочеты к примеру. вот)
     
  3. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    1.ну а как надо перебирать посимвольно и загонять в массив?
    я то думал в m будет лежать кол-во символов..
    2. нусс, я для запаса взял 10000. какое я значение должен добавить вместо 10000, m +1?
    3. бад аллок?..гмм..гммм..а как нада?..
    4. проверочку? щщщас...

    FILE *fin=fopen (argv [1], "r");
    while(!feof(fin)){
    if (fin!=NULL) {
    m=0;
    str[m++]=(char)fgetc(fin);}}...

    так?
     
  4. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    ололо. создай заново проект консольного приложения.
     
  5. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    нет, varnie, прав-ошибка в моем ДНК=)..
     
  6. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    Nok
    может все таки попробуешь студию освоить?
     
  7. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    я и в студии работал..не легла душа..
    а что, стоит?..
     
  8. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Nok
    по-порядку все делай. открыл файл - проверь что успешно. не знаешь как -- прочти C/C++ reference/в инете глянь описание ф-ции fopen. будут вопросы далее -- спрашивай, постараемся помочь.
     
  9. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    сделал так

    if ((FILE *fin=fopen (argv [1], "r")==NULL){
    printf("Can not open file: %s\n",argv [1])
    exit(0);}

    пишет [C++ Error] Unit1.cpp(10): E2034 Cannot convert 'bool' to 'FILE *'


    потом так
    FILE *fin=fopen (argv [1], "r");
    length=filelength((int)fin);
    char* str=new char[n];
    if (length==NULL){
    printf("Can not open file: %s\n",argv [1])
    exit(0);}

    запустил..
    Код (Text):
    1. #include<iostream>
    2. #include<windows.h>
    3. #include <io.h>
    4. using namespace std;
    5.  
    6. int main(int argc, char* argv[]){
    7.  
    8. int letter,i,m,var=9;
    9. int length;
    10. FILE *fin=fopen (argv [1], "r");
    11. length=filelength((int) fin);
    12. char* str=new char[length];
    13.  
    14. if (length==0){
    15.  printf("Can not open file: %s\n",argv [1]);
    16.  exit(0);}
    17.  
    18. while(!feof(fin))
    19. {        m=0;
    20.     str[m++]=(char)fgetc(fin);
    21. }
    22.  fclose(fin);
    23.  
    24. if(stricmp(argv [2],"-e")==0){
    25.  
    26. for(i = 0;i<length;i++)
    27. {
    28. str[i] =+ var;
    29.  
    30. FILE* fout = fopen( argv [3],"w");
    31. fprintf(fout,"%s \n",str);
    32. fclose(fout); }
    33. }
    34. delete []str ;
    35. return 0;
    36.  }
    смотрю..
    length=filelength((int) fin);

    возвращает -1..при любом размере файла!..
    жду наставлений..
     
  10. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    ааа..разобрался
    length=filelength(fileno(fin))

    но остальной код еще актуален!
     
  11. hilete

    hilete New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    28
    да вынеси ты уже m=0 из цикла...
     
  12. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    я даже вот так сделаю...
    так даже лучше..но не работает..не работает!..
    Код (Text):
    1. #include<iostream>
    2. #include<windows.h>
    3. #include <io.h>
    4. using namespace std;
    5.  
    6. int main(int argc, char* argv[]){
    7.  
    8. int letter,i,m,var=9;
    9. int length;
    10. FILE *fin=fopen (argv [1], "r");
    11. length=filelength((int) fin);
    12. char* str=new char[length];
    13.  
    14. if (length==0){
    15.  printf("Can not open file: %s\n",argv [1]);
    16.  exit(0);}
    17.  
    18.  for (m=0;m<length; m++){
    19.     str[m]=(char)fgetc(fin);
    20. }
    21.  
    22.  fclose(fin);
    23.  
    24. if(stricmp(argv [2],"-e")==0){
    25.  
    26. for(i = 0;i<length;i++)
    27. {
    28. str[i] =+ var;
    29.  
    30. FILE* fout = fopen( argv [3],"w");
    31. fprintf(fout,"%s \n",str);
    32. fclose(fout); }
    33. }
    34. delete []str ;
    35. return 0;
    36.  }
     
  13. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Код (Text):
    1. str[i] =+ var;
    тут ты просто в str записываешь значение лежащее по var
    а надо str += var;
    или же str = str + var;

    :derisive:

    далее..
    т.е. твоя проверка if (filelength == 0){ exit(-1) }
    вообще не верна
    и надо её заменить на
    Код (Text):
    1. long length = filelength(fileno(fin));
    2. if (filelength == -1) { fclose(handle);  delete [] str; exit(-1); }
    у тебя сейчас в случае провала нек условий будет утечка памяти, т.к. ты не освобождаешь str; подумай над этим :)

    далее..
    про то, что ты не можешь проверить корректно ли открылся файл:
    вот тебе пример, глянь:
    Код (Text):
    1. /* fopen example */
    2. #include <stdio.h>
    3. int main ()
    4. {
    5.   FILE * pFile;
    6.   pFile = fopen ("myfile.txt","w");
    7.   if (pFile!=NULL)
    8.   {
    9.     fputs ("fopen example",pFile);
    10.     fclose (pFile);
    11.   }
    12.   return 0;
    13. }
    все работает.

    далее..
    у тебя вообще косячно сделана вот эта часть:
    Код (Text):
    1. for(i = 0;i<length;i++)
    2. {
    3. str[i] =+ var;
    4.  
    5. FILE* fout = fopen( argv [3],"w");
    6. fprintf(fout,"%s \n",str);
    7. fclose(fout); }
    у тебя здесь length раз открывается файл :)) в него пишется str и он закрывается =))
    замени этот ужос на:
    Код (Text):
    1. for(i = 0;i<length;i++){
    2. str[i] =+ var;
    3. }
    4.  
    5. FILE* fout = fopen( argv [3],"w");
    6. fprintf(fout,"%s \n",str);
    7. fclose(fout);
     
  14. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    что есть handle..файл?..
     
  15. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    в твоем случае это переменная fin
    хендл открытого файла, полученный по возрату ф-ции fopen.
     
  16. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    да, ты правююучел и исправил..так?..

    Код (Text):
    1. #include<iostream>
    2. #include<windows.h>
    3. #include <io.h>
    4.  
    5.  
    6. using namespace std;
    7.  
    8. int main(int argc, char* argv[]){
    9.  
    10. int letter,i,m,var=9;
    11. FILE *fin=fopen (argv[1], "r");
    12.  if (fin!=NULL)
    13. {
    14.     fputs ("fopen example",fin);
    15.     fclose (fin);
    16.   }
    17.   return 0;
    18.  
    19. long length=filelength(fileno(fin));
    20. char* str=new char[length];
    21.  
    22.  
    23. if (length==-1){
    24.   fclose(fin);
    25.   delete [] str;
    26.  printf("nice file: %s\n",argv [1]);
    27.  exit(-1);}
    28.  
    29. for (m=0;m<length;m++) {
    30. str[m]=(char)fgetc(fin);
    31.  
    32. }
    33. fclose(fin);
    34.  
    35. if(stricmp(argv [2],"-e")==0){
    36. for(i = 0;i<length;i++){
    37. str[i]=str[i]+ var;}
    38. FILE* fout = fopen( argv [3],"w");
    39. fprintf(fout,"%s \n",str);
    40. fclose(fout);
    41. }
    42.  
    43. delete []str;
    44. return 0;
    45.  
    46.     }
    47. //---------------------------------------------------------------------------
     
  17. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Nok
    :))
    Код (Text):
    1. FILE *fin=fopen (argv[1], "r");
    2.  if (fin!=NULL)
    3. {
    4.     fputs ("fopen example",fin);
    5.     fclose (fin);
    6.   }
    7.   return 0;
    зачем ты тупо один в один скопипастил мой пример?:)
    тебе надо
    Код (Text):
    1. FILE *fin=fopen (argv[1], "r");
    2.  if (fin==NULL)
    3. {
    4.     fputs ("unable to open file! exit!",stdout); //или просто printf("unable to open file! exit!");
    5.     return -1;
    6.  }
    далее второй файл (fout) открыл, а не проверил также, на факт успешности его открытия. я устал уже за тебя думать.
     
  18. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    ну теперь точно все..даа?
    Код (Text):
    1. #include<iostream>
    2. #include<windows.h>
    3. #include <io.h>
    4.  
    5.  
    6. using namespace std;
    7.  
    8. int main(int argc, char* argv[]){
    9.  
    10. int letter,i,m,var=9;
    11. FILE *fin=fopen (argv[1], "r");
    12.  if (fin=NULL)
    13. {   printf("cannot open");
    14.       return 0;
    15.   }
    16.  
    17. long length=filelength(fileno(fin));
    18. char* str=new char[length];
    19.  
    20. if (length==-1){
    21.   fclose(fin);
    22.   delete [] str;
    23.  printf("nice file: %s\n",argv [1]);
    24.  exit(-1);}
    25.  
    26. for (m=0;m<length;m++) {
    27. str[m]=(char)fgetc(fin);
    28.  
    29. }
    30. fclose(fin);
    31.  
    32. if(stricmp(argv [2],"-e")==0){
    33. for(i = 0;i<length;i++){
    34. str[i]=str[i]+ var;}
    35.  
    36. FILE* fout = fopen( argv [3],"w");
    37.  if (fout=NULL)
    38. {
    39.  printf("cannot open");;
    40.       return 0;
    41.   }
    42. fprintf(fout,"%s \n",str);
    43. fclose(fout);
    44. }
    45.  
    46. delete []str;
    47. return 0;
    48.     }
     
  19. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Nok
    нет. не хочешь учиться и анализировать -- я за тебя более не буду ^_^
     
  20. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    а гори оно огнем..такой простой код, а мороки..
    спасибо тебе и на том..помог очень=)..