Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "хлам" в char str[]; 
V
    Опции темы
Cpir
  Дата 15.10.2006, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.10.2006

Репутация: нет
Всего: нет



Привет всем! Программировать на C++  я начал недавно и пока мало что знаю. На днях понадобилась программа которая копирует файлы, указаные в текстовом файле, в отдельную папку. После небольшого поиска решил делать это модифицируя строку из файла для использования в system();
Проблема в том, что программа после выполнения забивает строку всяким "хламом."
Код

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>

using namespace std;

int Getlen(char *str1);
void Clears(char *str1);
void AddStr(char *str1, char *str2);
void FindAndAdd(char *Target, char *Input);
void Getfname(char *Output, char *Input);

void Clears(char *str1)
{
    int i;
    for(i=0; str1[i]; i++)
    {
        str1[i]='\0';
    }
}

int Getlen(char *str1)
{
    int i;
    for(i=0; str1[i];i++)
    {
    }
    return i;
}

void Getfname(char *Output, char *Input)
{
    int i,e;
    for(i=Getlen(Input); !(Input[i]=='\\'); i--)
    {
    }
    i++;
    for(i, e=0; Input[i]; i++, e++)
    {
        Output[e]=Input[i];
    }
    Output[e]='\0';
}


void FindAndAdd(char *Target, char *Input)
{
    int i,e;
    for(i=0, e=0; Input[i]; i++, e++)
    {
        Target[e]=Input[i];
        if(Input[i]=='\\')
        {
            e++;
            Target[e]=Input[i];
        }
    }
    e++;
    Target[e]='\0';
}

void AddStr(char *str1, char *str2)
{
    int i,k;
    for(i=0; str1[i]; i++);
    {
    }
    for(i,k=0; str2[k]; i++,k++)
    {
        str1[i]=str2[k];
    }
    str1[i]='\0';
}

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

char InpLine[300];
char Temp[300];
char Command[300];
char Whereto[300];
char Tempfname[300];
int i;
char c;

cout << "Please enter the output dir : ";
cin >> Whereto;
cout << '\n';


ifstream in(argv[1], ios::out | ios::binary);

if(!in) {
    cout<<"hlaammmm";
    return 1;
}
while(in) 
{
    in.getline(InpLine, 1000, '\n');
    if(in) 
    {
        //if # found then do nothing and go to the next string
        if (InpLine[0]=='#'){

        }
        //else get inside the main loop
        else {
        //main loop
            //add command
            AddStr(Temp, "copy ");
            //if no HDD letter in input then at first add it to "copy .." and then
            if (InpLine[0]=='\\')
            {
                AddStr(Temp,"D:");
            }
            //add path to "copy .." from input
            AddStr(Temp,InpLine);
            //add path to output dir
            AddStr(Temp," ");
            AddStr(Temp,Whereto);
            //copy filename (***.mp3) from input and add it
            Getfname(Tempfname,InpLine);
            AddStr(Temp,Tempfname);
            //run search for '\' char and add another one if found

            FindAndAdd(Command,Temp);
            //execute copy by running system("final string");

            if ((c = getchar()) = ' ')
            {
               cout << Command;
                            
            } 

            //Clear strings for next file
            Clears(Command);
            Clears(Temp);
            Clears(Tempfname);

        }
    }
}
in.close();
return 0;
}



Это сообщение отредактировал(а) Cpir - 15.10.2006, 01:07
PM   Вверх
Oleg_Ci
Дата 15.10.2006, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Вот, порылся... две ошибки норыл, в начале и в конце смотри. И мелочей разных, как-бы я то или это сделал.
Код

char InpLine[300]; // выделено 300
...
in.getline(InpLine, 1000, '\n'); // пытаешся читать 1000
//_____________________________________________
// в место :
void Clears(char *str1)
{
    int i;
    for(i=0; str1[i]; i++)
    {
        str1[i]='\0';
    }
}
// так нельзя ???
*str = '\0';
//________________________________________________
int Getlen(char *str1)
{
  return strlen( str1 ); // ?
}
//________________________________________________
// в место :
void Getfname(char *Output, char *Input)
{
    int i,e;
    for(i=Getlen(Input); !(Input[i]=='\\'); i--)
    {
    }
    i++;
    for(i, e=0; Input[i]; i++, e++)
    {
        Output[e]=Input[i];
    }
    Output[e]='\0';
}
// нечто токое :
void Getfname(char *Output, char *Input)
{
    Input = strrchr( Input, '\\' );
    Input++;
    strcpy( Output, Input );
}
//____________________________________________
// В место этого :
void AddStr(char *str1, char *str2)
{
    int i,k;
    for(i=0; str1[i]; i++);
    {
    }
    for(i,k=0; str2[k]; i++,k++)
    {
        str1[i]=str2[k];
    }
    str1[i]='\0';
}
// Вот так :
void AddStr(char *str1, char *str2)
{
    str1 += strlen( str1 );
    strcpy( str1, str2 );
}
//___________________________________________
char Temp[300]; // помять с хламом...
...
AddStr(Temp, "copy "); // дописываеш, а у тебя там поиск нуля
// т.е. окончания строки( в Temp ), тогда так надо:
strcpy(Temp, "copy ");

// или так :
char Temp[300];
Temp[0] = '\0';
...
AddStr(Temp, "copy ");
Да и вообще для безопасности или проверки можно-было обнулить все массивы char в начале прогграммы:
Код

char InpLine[300] = {0};
char Temp[300] = {0};
char Command[300] = {0};
char Whereto[300] = {0};
char Tempfname[300] = {0};


Это сообщение отредактировал(а) Олег4 - 15.10.2006, 06:32
PM MAIL   Вверх
Cpir
Дата 15.10.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.10.2006

Репутация: нет
Всего: нет



Олег4, спасибо за советы  smile 
Я нашел в чем была ошибка ... когда я читал из файла то строка заканчиалась \r\0 smile
Надо было просто заменить \r на \0  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.