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

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

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Nok
    я сомневаюсь, что ты как минимум попытался скомпилить этот вариант.
    какая логикак в твоем
    Код (Text):
    1.  if (fin=NULL)
    2. {   printf("cannot open");
    3.       return 0;
    4.   }
    ?
     
  2. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    да, ты прав..
    но на выходе получается на 5 буквы больше!..как оказалось..взялись они при записи из файла, откуда?..незнаю, мы же написали очистку массива..да?..
    Код (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=2;
    11. FILE *fin=fopen (argv[1], "r");
    12.  if (fin==NULL)
    13. {
    14.    printf("unable to open file!");
    15.     exit(-1);
    16.   }
    17.  
    18. long length=filelength(fileno(fin));
    19. char* str=new char[length];
    20.  
    21. if (length==-1){
    22.   fclose(fin);
    23.   delete [] str;
    24.  printf("nice file: %s\n",argv [1]);
    25.  exit(-1);}
    26.  
    27. for (m=0;m<length;m++) {
    28. str[m]=(char)fgetc(fin);
    29.  
    30. }
    31. fclose(fin);
    32.        cout<<"so..\n";
    33.        cout<<str<<"\n"; //это можно проверит здесь!
    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. if (fout==NULL)
    40. {
    41.    printf("unable to open file!");
    42.     exit(-1);
    43.   }
    44.  
    45. fprintf(fout,"%s \n",str);
    46. fclose(fout);
    47. }
    48.  
    49. delete []str;
    50.  
    51. return 0;
    52. //getchar();
    53. //Sleep(400000);
    54.     }
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Nok
    потому что строки в Си явл нулл-терминированными строками. их длиной считается вся длина до первого встречного символа завершения строки '\0'.
    т.о. нужно аллоцировать буфер на 1 элемент больше чем размер текущего файла.
    и записывать в посл. элемент этого буфера '\0'.
    кстати, если у тебя в считываемом файле где-нить присутствует этот символ, то при выводе дальнейшем содержимого буфера он у тебя выведется аккурат до этой позиции:)

    ps: и еще, у тебя опять недочёт в коде. я не знаю почему, но ты не учитываешь то что я тебе говорю, а тупо копи-пастишь. подсказка: возможная утечка памяти.
     
  4. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    ммм..в исходном файле было три буквы..
    "abc"
    при сдвиге на var=2, стало..
    "cde2(Yh2"

    я немножко не понимаю причем тут терминал 0! ведь ясно, что abc0..и все)

    2й вариант!
    ммм..в исходном файле было три буквы..
    "abcd0"
    при сдвиге на var=2, стало..
    "cdef2Yh2 "

    щас поищу утечку файла..
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Nok
    ты этот вывод получаешь при выводе в консоль буфера. так? так.
    предположим, у тебя буфер содержал "a","b","c". ты сделал сдвиг на 2 символа. получилось "cde". далее ты делаешь вывод в этот буфер в консоль (или же записываешь в файл), но в любом случае ты работаешь с char *. и он выведется(запишется в файл) весь полностью, и будет далее писать символы до тех пор, шагая уже по левой памяти, пока не встретит нулл-терминирующий символ. отсюда и эти левые символы появились.
    как с этим бороться я тебе выше написал.

    ps: искать надо не утечку файла, а утечку памяти:) проследи все ветки своей программы и увидишь.
     
  6. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    все что увидел..
    Код (Text):
    1. while(!feof(fin)){
    2. for (m=0;m<length;m++) {
    3. //if (str[m]=='0') break;
    4. str[m]=(char)fgetc(fin);
    5.  }
    6. }
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    зачем здесь вложенный for ???
    прочти мой предыдущий ответ. я тебе написал там как всё это побороть. выдели на 1 символ больше под массив str и после считывания в него из входного файла запиши в посл его позицию (массива str) '0'.
    все выведится правильно.
    потом ессно при delete не забудь удалить на 1 элемент больше ессно.
     
  8. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    сорь за тупость..теперь асилил..
    Код (Text):
    1. for (m=0;m<length;m++) {
    2. str[m]=(char)fgetc(fin);
    3. }
    4. str[length]='\0';
    спасибо!
     
  9. Nok

    Nok New Member

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

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Nok
    рад что помогло:)
     
  11. Nok

    Nok New Member

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

    varnie New Member

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