Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > копирование файлов в Си


Автор: Гость_opex 25.3.2004, 00:05
как копировать файл с любым разрешением (на Си )
текстовые файл копируются но в конце появляется символ "я"
а допустим ехе не в какую
Код
#include <stdio.h>
void main()
{ char n,name1[20],name2[20];
FILE *file1,*file2;
clrscr();
printf("\nname copy file ");
scanf("%s",&name1);
printf("\nname copy to ");
scanf("%s",&name2);
file1 = fopen(name1,"r");
file2 = fopen(name2,"w");
 for(;!feof(file1);)
 {
  fscanf(file1,"%1c",&n);
  fprintf(file2,"%c",n);
 }
fclose(file1);
fclose(file2);
}

зарание благодарен

Автор: Opex 25.3.2004, 00:07
может еть какаянибуть библиотечная функция

Автор: sergejzr 25.3.2004, 02:14
Цитата
for(;!feof(file1);)
{
  fscanf(file1,"%1c",&n);
  }


Так не пойдёт. Ты ищешь в файле знак EOF (их в .ехе куча может быть smile.gif ).
Пользуйся read() write(), чтобы копировать "вслепую".

Обязательно посмотри мануалы к этим функциям.

Пример (без опросов на существованиe файлов):
Код

#include <stdio.h>
#include <io.h>

int main(int argc, char *argv[])
{
FILE * in, * out;
int  n;
char buf [512];

in=fopen(argv[1],"rb");
out=fopen(argv[2],"w");

while ((n = read(fileno(in), buf, sizeof buf)) > 0)
 {
   write(fileno(out), buf, n);  
 }

 return 0;
}

PS: Bопросик, кто нить знает, как подцветку кода в сообщениях включать?
Добавлено @ 02:16
read() write() НАМНОГО быстрее.
Величину buf регулируй по вкусу smile.gif

Автор: NiJazz 25.3.2004, 08:27
Если делаешь под Windows, то лучше используй CopyFile.

Автор: Opex 25.3.2004, 10:51
sergej.z большое спасибо но я не понимаю зачем в функции main в списке формальных пораметров сидит int argc или я чтото не догнал.

NiJazz а можно по подробнее про CopyFile.

Автор: OlegsDP 25.3.2004, 12:48
The CopyFile function copies an existing file to a new file.
BOOL CopyFile(
LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);

Parameters
lpExistingFileName
Points to a null-terminated string that specifies the name of an existing file.
lpNewFileName
Points to a null-terminated string that specifies the name of the new file.
bFailIfExists
Specifies how this operation is to proceed if a file of the same name as that specified by lpNewFileName already exists. If this parameter is TRUE and the new file already exists, the function fails. If this parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds.

Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
Security attributes for the existing file are not copied to the new file.
File attributes (FILE_ATTRIBUTE_*) for the existing file are copied to the new file. For example, if an existing file has the FILE_ATTRIBUTE_READONLY file attribute, a copy created through a call to CopyFile will also have the FILE_ATTRIBUTE_READONLY file attribute. For further information on file attributes, see CreateFile.

Автор: NiJazz 25.3.2004, 13:15
Код
BOOL CopyFile(
 LPCTSTR lpExistingFileName,
 LPCTSTR lpNewFileName,
 BOOL bFailIfExists
);


lpExistingFileName - Имя текущего файла, который хочешь копировать. Например, C:\\myDir\\MyFile.txt

lpNewFileName - куда хочешь его скопировать. Например, C:\\NewDir\\MyNewFile.txt. Можно просто C:\\NewDir\\, если не хочешь менять имени.

bFailIfExists - опеределяет, надо ли заменять файл, если такой существует. FALSE - перезаписать.

Не забудь сделать #include <windows.h>

Автор: sergejzr 25.3.2004, 13:47
Цитата

...зачем в функции main в списке формальных пораметров сидит int argc...

Если вызвать программу с аргументами например:

my.exe infile.txt outfile.txt

то argc осведомит в main о количестве переданных аргументов, а argv будет содержать эти аргументы.
Абсолютно верно, что в моём примере argc не используется.
Этот пример был написан на скорую руку(даже fclose() не был вызван). Вообще то надо было бы проверить, сколько аргументов было передано в нашу программу.
Код

int main(int argc, char *argv[])
{
FILE * in, * out;
int  n;
char buf [512];

//нам необходимо 3 аргумента для работы программы my.exe,infile,outfile
if(argc<3)
{//не указан infile outfile
printf("use %s infile outfile\n",argv[0]);
}

//Рассмотрим массив argv
//argv[0] - имя с которым была вызвана наша программа. Ведь юзер мог изменить имя файла
//argv[1] - infile
//argv[2] - outfile

//Так же можем использовать argc для распечатки всех аргументов
for(n=0;n<argc;n++)
{
printf("argv[%i]=%s",n,argv[n]);
}
//Дальше следует код..

}


PS:
CopyFile внутренне работает так же, но с этой функцией у меня две проблемы.
  • 1. работет только на Виндах.
  • 2. до содержения файла не доберёшься
Преимущество этой функции конечно в том, что она по идее работает быстрей, так как Windows сам выберет оптимальный размер buf.

Автор: Guest 25.3.2004, 19:24
всем большое спамибо

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