Nok я сомневаюсь, что ты как минимум попытался скомпилить этот вариант. какая логикак в твоем Код (Text): if (fin=NULL) { printf("cannot open"); return 0; } ?
да, ты прав.. но на выходе получается на 5 буквы больше!..как оказалось..взялись они при записи из файла, откуда?..незнаю, мы же написали очистку массива..да?.. Код (Text): #include<iostream> #include<windows.h> #include <io.h> using namespace std; int main(int argc, char* argv[]){ int letter,i,m,var=2; FILE *fin=fopen (argv[1], "r"); if (fin==NULL) { printf("unable to open file!"); exit(-1); } long length=filelength(fileno(fin)); char* str=new char[length]; if (length==-1){ fclose(fin); delete [] str; printf("nice file: %s\n",argv [1]); exit(-1);} for (m=0;m<length;m++) { str[m]=(char)fgetc(fin); } fclose(fin); cout<<"so..\n"; cout<<str<<"\n"; //это можно проверит здесь! if(stricmp(argv [2],"-e")==0){ for(i = 0;i<length;i++){ str[i]=str[i]+ var;} FILE* fout = fopen( argv [3],"w"); if (fout==NULL) { printf("unable to open file!"); exit(-1); } fprintf(fout,"%s \n",str); fclose(fout); } delete []str; return 0; //getchar(); //Sleep(400000); }
Nok потому что строки в Си явл нулл-терминированными строками. их длиной считается вся длина до первого встречного символа завершения строки '\0'. т.о. нужно аллоцировать буфер на 1 элемент больше чем размер текущего файла. и записывать в посл. элемент этого буфера '\0'. кстати, если у тебя в считываемом файле где-нить присутствует этот символ, то при выводе дальнейшем содержимого буфера он у тебя выведется аккурат до этой позиции ps: и еще, у тебя опять недочёт в коде. я не знаю почему, но ты не учитываешь то что я тебе говорю, а тупо копи-пастишь. подсказка: возможная утечка памяти.
ммм..в исходном файле было три буквы.. "abc" при сдвиге на var=2, стало.. "cde2(Yh2" я немножко не понимаю причем тут терминал 0! ведь ясно, что abc0..и все) 2й вариант! ммм..в исходном файле было три буквы.. "abcd0" при сдвиге на var=2, стало.. "cdef2Yh2 " щас поищу утечку файла..
Nok ты этот вывод получаешь при выводе в консоль буфера. так? так. предположим, у тебя буфер содержал "a","b","c". ты сделал сдвиг на 2 символа. получилось "cde". далее ты делаешь вывод в этот буфер в консоль (или же записываешь в файл), но в любом случае ты работаешь с char *. и он выведется(запишется в файл) весь полностью, и будет далее писать символы до тех пор, шагая уже по левой памяти, пока не встретит нулл-терминирующий символ. отсюда и эти левые символы появились. как с этим бороться я тебе выше написал. ps: искать надо не утечку файла, а утечку памяти проследи все ветки своей программы и увидишь.
все что увидел.. Код (Text): while(!feof(fin)){ for (m=0;m<length;m++) { //if (str[m]=='0') break; str[m]=(char)fgetc(fin); } }
зачем здесь вложенный for ??? прочти мой предыдущий ответ. я тебе написал там как всё это побороть. выдели на 1 символ больше под массив str и после считывания в него из входного файла запиши в посл его позицию (массива str) '0'. все выведится правильно. потом ессно при delete не забудь удалить на 1 элемент больше ессно.
сорь за тупость..теперь асилил.. Код (Text): for (m=0;m<length;m++) { str[m]=(char)fgetc(fin); } str[length]='\0'; спасибо!