Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Парни помогите, вы все знаете ответ на этот вопрос


Автор: bloood 30.3.2007, 23:26
Данная программа сравнивает файлы, вопрос такой:
данная программа запускается с помощью консоли, чтоб запустить надо ввести в консоли
<имя проги> <имя файла1> <имя файла 2>(enter)....как указать в коде пути к файлу1 и файлу2, чтоб не вводить их при запуске из консоли??? <имя проги> это ЕХЕ файл, полученый из кода ниже. Xpsp2, borland turbo c++ 2006. Спасибо!

#include <vcl.h>
#pragma hdrstop
#include <iostream> 
#include <fstream> 
using namespace std;


//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char *argv[])
{
register int i; 
int numread; 

unsigned char buffer1[4096], buffer2[4096];

if(argc!=3) { 
cout << "Usage: compfiles <file1> <file2>\n";
return 1;
}

ifstream f1(argv[1], ios::in | ios::binary);
if(!f1) {
cout << "Cannot open first file.\n";
return 1;
}
ifstream f2(argv[2], ios::in | ios::binary);
if(!f2) {
cout << "Cannot open second file.\n";
return 1;
}

cout << "Comparing files...\n";

do {
f1.read((char *) buffer1, sizeof buffer1);
f2.read((char *) buffer2, sizeof buffer2);

if(f1.gcount() != f2.gcount()) { 
cout << "Files are of differing sizes.\n"; 
f1.close(); 
f2.close(); 
return 0; 


for(i = 0; i <f1.gcount(); i++) // compare contents of buffers 
if(buffer1[i] != buffer2[i]) { 
cout << "Files differ.\n"; 
f1.close(); 
f2.close();
return 0;


} while(!f1.eof() && !f2.eof()); 

cout << "Files are the same.\n"; 

f1.close(); 
f2.close(); 

return 0;
}

Автор: Xenon 31.3.2007, 01:32
Код

#include <vcl.h>
#pragma hdrstop
#include <iostream> 
#include <fstream> 
#include <string>
using namespace std;


//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char *argv[])
{
    register int i; 
    int numread; 
    unsigned char buffer1[4096], buffer2[4096];
    string path_a = "c:\\BLA-BLA";
    stding path_b = "d:\\BLA-BLA-BLA";
    ifstream f1(path_a, ios::in | ios::binary);
    if(!f1)
    {
        cout << "Cannot open first file.\n";
        return 1;
    }
    ifstream f2(path_b, ios::in | ios::binary);
    if(!f2) 
    {
        cout << "Cannot open second file.\n";
        return 1;
    }
    cout << "Comparing files...\n";
    do 
    {
        f1.read((char *) buffer1, sizeof buffer1);
        f2.read((char *) buffer2, sizeof buffer2);

        if(f1.gcount() != f2.gcount()) 
        { 
            cout << "Files are of differing sizes.\n"; 
            f1.close(); 
            f2.close(); 
            return 0; 
        } 
        for(i = 0; i <f1.gcount(); i++) // compare contents of buffers 
        if(buffer1[i] != buffer2[i]) 
        { 
            cout << "Files differ.\n"; 
            f1.close(); 
            f2.close();
            return 0;
        } 
    }while(!f1.eof() && !f2.eof()); 

    cout << "Files are the same.\n"; 

    f1.close(); 
    f2.close(); 

return 0;
}

Автор: bloood 31.3.2007, 10:05
Не работает, вот что выдаёт при запуске, номер строки, как в твоём коде....

[C++ Error] Unit1.cpp(18): E2451 Undefined symbol 'stding'
[C++ Error] Unit1.cpp(18): E2379 Statement missing ;
[C++ Error] Unit1.cpp(19): E2285 Could not find a match for 'ifstream::basic_ifstream(string,_Iosb<int>::_Openmode)'
[C++ Error] Unit1.cpp(25): E2451 Undefined symbol 'path_b'
[C++ Error] Unit1.cpp(25): E2285 Could not find a match for 'ifstream::basic_ifstream(undefined,_Iosb<int>::_Openmode)'

Добавлено через 7 минут и 8 секунд
Прошу прощение, опечатка в строке 18 вместо stding, должно быть string....
Но всё равно ошибки в строках 19 и 25 такого плана
[C++ Error] Unit1.cpp(19): E2285 Could not find a match for 'ifstream::basic_ifstream(string,_Iosb<int>::_Openmode)'
[C++ Error] Unit1.cpp(25): E2285 Could not find a match for 'ifstream::basic_ifstream(string,_Iosb<int>::_Openmode)'

Автор: mr.Anderson 31.3.2007, 10:20
Это речь о том, что нет конструктора класса ifstream с теми аргументами, которые заданы. В скобках может быть указано только имя файла.

Автор: _Natalia_ 31.3.2007, 11:25
А мона девченки тоже помогут?
Код

char* newpath = new char();
newpath = strcat("C:\\",argv[1]);


попробуй так,  просто конструктор ifstream берет как первый аргумент const char*, а не string,
ну или в предыдущем ответе, просто сделай вот так 
Код

ifstream f1(path_a.c_str(), ios::in | ios::binary);

функция c_str() возвращает string в виде const char*

Автор: 0lmer 31.3.2007, 13:34
Цитата(_Natalia_ @  31.3.2007,  11:25 Найти цитируемый пост)
char* newpath = new char();


а так можно???

Автор: Xenon 31.3.2007, 13:49
Блин, вот что ночь в людьми делает ... Совсем забыл
Код

#include <vcl.h>
#pragma hdrstop
#include <iostream> 
#include <fstream> 
#include <string>
using namespace std;


//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char *argv[])
{
    register int i; 
    int numread; 
    unsigned char buffer1[4096], buffer2[4096];
    string path_a = "c:\\BLA-BLA";
    stding path_b = "d:\\BLA-BLA-BLA";
    ifstream f1(path_a.c_str(), ios::in | ios::binary);
    if(!f1)
    {
        cout << "Cannot open first file.\n";
        return 1;
    }
    ifstream f2(path_b.c_str(), ios::in | ios::binary);
    if(!f2) 
    {
        cout << "Cannot open second file.\n";
        return 1;
    }
    cout << "Comparing files...\n";
    do 
    {
        f1.read((char *) buffer1, sizeof buffer1);
        f2.read((char *) buffer2, sizeof buffer2);

        if(f1.gcount() != f2.gcount()) 
        { 
            cout << "Files are of differing sizes.\n"; 
            f1.close(); 
            f2.close(); 
            return 0; 
        } 
        for(i = 0; i <f1.gcount(); i++) // compare contents of buffers 
        if(buffer1[i] != buffer2[i]) 
        { 
            cout << "Files differ.\n"; 
            f1.close(); 
            f2.close();
            return 0;
        } 
    }while(!f1.eof() && !f2.eof()); 

    cout << "Files are the same.\n"; 

    f1.close(); 
    f2.close(); 

return 0;

}

PS. Опередили smile

Добавлено через 1 минуту и 41 секунду
0lmer, У тебя путь из одного символа будет smile

Автор: _Natalia_ 31.3.2007, 13:55
Цитата(0lmer @  31.3.2007,  13:34 Найти цитируемый пост)

Цитата(_Natalia_ @  31.3.2007,  11:25 )
char* newpath = new char();

a так можно??? 


можно, и это не говорит о размере массива, а только инициализирует указатель. в последствии он может содержать сколько угоодно элементов. если не кажется очень чистой эта записать, тогде делай
char* newpath = new char[1024];

Автор: Xenon 31.3.2007, 14:08
Но тогда появится летучий голандец в виде одного элемента char

Автор: bloood 31.3.2007, 17:03
Блин у меня нет 100 постов, чтоб изменять репутацию, СПАСИБО ВАМ ВСЕМ ОГРОМНОЕ, всё работает как надо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)