товагесчи, не компилиццо.. код реализует кодировку алгоритмом Цезаря.. код, вроде норм..(имхо, не забейте камнями) эррор таков: [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; }
Код (Text): while(!feof(fin)) { m=0; str[m++]=(char)fgetc(fin); } жесть. по выходу из тела этого цикла у тебя m будет равняться 1, а в массиве str будет лежать лишь str[0] элемент, равный последнему введенному символу с консоли. все остальные его 10000-1 элементы будут непроинициализированные. это раз. а два -- это то, что у тебя размерность буфера str фиксированная. какие у тебя гарантии, что указанный с консоли файл будет содержать НЕ БОЛЬШЕ 10000 байт? три -- не проверяешь new. может вылететь std::bad_alloc. четыре -- та же fopen может вернуть NULL не открыв файл. у тебя проверки нету. это при поверхностно взгляде на код. более детально не глядел, т.ч. могут быть еще недочеты к примеру. вот)
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);}}... так?
Nok по-порядку все делай. открыл файл - проверь что успешно. не знаешь как -- прочти C/C++ reference/в инете глянь описание ф-ции fopen. будут вопросы далее -- спрашивай, постараемся помочь.
сделал так 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): #include<iostream> #include<windows.h> #include <io.h> using namespace std; int main(int argc, char* argv[]){ int letter,i,m,var=9; int length; FILE *fin=fopen (argv [1], "r"); length=filelength((int) fin); char* str=new char[length]; if (length==0){ printf("Can not open file: %s\n",argv [1]); exit(0);} while(!feof(fin)) { m=0; str[m++]=(char)fgetc(fin); } fclose(fin); if(stricmp(argv [2],"-e")==0){ for(i = 0;i<length;i++) { str[i] =+ var; FILE* fout = fopen( argv [3],"w"); fprintf(fout,"%s \n",str); fclose(fout); } } delete []str ; return 0; } смотрю.. length=filelength((int) fin); возвращает -1..при любом размере файла!.. жду наставлений..
я даже вот так сделаю... так даже лучше..но не работает..не работает!.. Код (Text): #include<iostream> #include<windows.h> #include <io.h> using namespace std; int main(int argc, char* argv[]){ int letter,i,m,var=9; int length; FILE *fin=fopen (argv [1], "r"); length=filelength((int) fin); char* str=new char[length]; if (length==0){ printf("Can not open file: %s\n",argv [1]); exit(0);} for (m=0;m<length; m++){ str[m]=(char)fgetc(fin); } fclose(fin); if(stricmp(argv [2],"-e")==0){ for(i = 0;i<length;i++) { str[i] =+ var; FILE* fout = fopen( argv [3],"w"); fprintf(fout,"%s \n",str); fclose(fout); } } delete []str ; return 0; }
Код (Text): str[i] =+ var; тут ты просто в str записываешь значение лежащее по var а надо str += var; или же str = str + var; далее.. т.е. твоя проверка if (filelength == 0){ exit(-1) } вообще не верна и надо её заменить на Код (Text): long length = filelength(fileno(fin)); if (filelength == -1) { fclose(handle); delete [] str; exit(-1); } у тебя сейчас в случае провала нек условий будет утечка памяти, т.к. ты не освобождаешь str; подумай над этим далее.. про то, что ты не можешь проверить корректно ли открылся файл: вот тебе пример, глянь: Код (Text): /* fopen example */ #include <stdio.h> int main () { FILE * pFile; pFile = fopen ("myfile.txt","w"); if (pFile!=NULL) { fputs ("fopen example",pFile); fclose (pFile); } return 0; } все работает. далее.. у тебя вообще косячно сделана вот эта часть: Код (Text): for(i = 0;i<length;i++) { str[i] =+ var; FILE* fout = fopen( argv [3],"w"); fprintf(fout,"%s \n",str); fclose(fout); } у тебя здесь length раз открывается файл ) в него пишется str и он закрывается =)) замени этот ужос на: Код (Text): for(i = 0;i<length;i++){ str[i] =+ var; } FILE* fout = fopen( argv [3],"w"); fprintf(fout,"%s \n",str); fclose(fout);
да, ты правююучел и исправил..так?.. Код (Text): #include<iostream> #include<windows.h> #include <io.h> using namespace std; int main(int argc, char* argv[]){ int letter,i,m,var=9; FILE *fin=fopen (argv[1], "r"); if (fin!=NULL) { fputs ("fopen example",fin); fclose (fin); } return 0; 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); if(stricmp(argv [2],"-e")==0){ for(i = 0;i<length;i++){ str[i]=str[i]+ var;} FILE* fout = fopen( argv [3],"w"); fprintf(fout,"%s \n",str); fclose(fout); } delete []str; return 0; } //---------------------------------------------------------------------------
Nok ) Код (Text): FILE *fin=fopen (argv[1], "r"); if (fin!=NULL) { fputs ("fopen example",fin); fclose (fin); } return 0; зачем ты тупо один в один скопипастил мой пример? тебе надо Код (Text): FILE *fin=fopen (argv[1], "r"); if (fin==NULL) { fputs ("unable to open file! exit!",stdout); //или просто printf("unable to open file! exit!"); return -1; } далее второй файл (fout) открыл, а не проверил также, на факт успешности его открытия. я устал уже за тебя думать.
ну теперь точно все..даа? Код (Text): #include<iostream> #include<windows.h> #include <io.h> using namespace std; int main(int argc, char* argv[]){ int letter,i,m,var=9; FILE *fin=fopen (argv[1], "r"); if (fin=NULL) { printf("cannot open"); return 0; } 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); 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("cannot open");; return 0; } fprintf(fout,"%s \n",str); fclose(fout); } delete []str; return 0; }