Передача входного файла в выходной файл в C?
В настоящее время я могу (я думаю) открыть файл с помощью fopen. В целях тестирования я хочу иметь возможность передать содержимое файла в выходной файл, но я не получаю желаемых результатов. Вот некоторый код:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]){ //practice on utilizing IO
char filepath[100];
char filepath2[100];
strcpy(filepath,"./");
strcpy(filepath,"./");
char typed[90];
char msg[1024];
FILE * new_file;
FILE * old_file;
// printf("Input file to be created\n");
printf("File to be opened as input: \n");
printf("--->");
fgets(typed,90,stdin); //read in file name
strtok(typed, "\n");
strcat(filepath,typed);
old_file = fopen(filepath, "r");
printf("file to output to: \n");
fgets(filepath2,100, stdin);
strtok(filepath2, "\n");
///attempt to create that file
new_file = fopen(filepath2,"w");
//printf("%s\n", msg);
}
Любая помощь приветствуется.
2 ответа
Открытие дескриптора файла в программе немного отличается от открытия документа в текстовом процессоре. Это больше похоже на открытие книги. Чтобы читать или писать, вы должны использовать свои глаза (потребляя данные) или карандаш (производя данные).
Поскольку у вас есть открытые файлы, вам нужно прочитать данные из первого файла и записать их во второй файл. Что-то вроде:
size_t nread;
do {
nread = fread(msg, 1, 1024, old_file);
fwrite(msg, 1, nread, new_file);
} while(nread != 0);
Или же
int nread;
do {
nread = fgets(msg, 1023, old_file);
fputs(msg, new_file);
} while (nread > 0);
Или даже просто символ за один раз.
int c;
while ( (c=fgetc(old_file)) != EOF) {
fputc(c, new_file);
}
Кроме того, вы не добавляете "./" ко второму файлу. Не уверен, что это важно, но вы сделали это с первым файлом.
Кроме того, вы должны использовать fopen
на новый_файл. freopen
само по себе не так, но это странно и сбивает с толку других (в том числе и меня).
Функция freopen() открывает файл, имя которого является строкой, на которую указывает путь, и связывает с ней поток, на который указывает поток. Исходный поток (если он существует) закрыт. Аргумент mode используется так же, как и в функции fopen(). src: manpage
Таким образом, он откроет поток по вашему желанию, но при этом уничтожит стандартный вывод. Так что ваша программа больше не может делать нормальный вывод. Это может быть неважно, но в этом случае также нет никакого реального преимущества.
Я создал небольшой c-файл, похожий на ваш, надеюсь, он поможет вам лучше понять ввод-вывод в C.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char fileNameOne[] = "test.txt";
char fileNameTwo[] = "new.txt";
FILE* oldFile;
FILE* newFile;
printf("The file being read from is: %s\n", fileNameOne);
//get a File pointer to the old file(file descriptor)
oldFile = fopen(fileNameOne, "r");
//get a File pointer to the new file(file descriptor)
//a+ is to open for read and writing and create if it doesnt exist
//if we did not specify a+, but w+ for writing, we would get an invalid file descriptor because the file does not exist
newFile = fopen(fileNameTwo, "a+");
if (newFile == 0) {
printf("error opening file\n");
exit(1);
}
//read everything from the old file into a buffer
char buffer[1024];
printf("Contents of old file:\n");
while (fread(buffer, 1, 1024, oldFile) != 0) {
//if fread returns zero, and end of file has occured
printf("%s", buffer);
//directly write the contents of fileone to filetwo
fwrite(buffer, 1, 1024, newFile);
}
printf("The file %s has been read and written to %s\n", fileNameOne, fileNameTwo);
printf("Verification: Contents of file two:\n");
//move the offset back to the beginning of the file
rewind(newFile);
while (fread(buffer, 1, 1024, newFile)!= 0) {
printf("%s", buffer);
}
printf("\nEnd of file 2\n");
}
Я сделал текстовый файл с именем test в том же каталоге и просто записал в него какую-то фигню. Это выход.
Выход:
The file being read from is: test.txt
Contents of old file:
Hi, my name is Jack!
HAHAHAH
YOU DON"T even know!
The file test.txt has been read and written to new.txt
Verification: Contents of file two:
Hi, my name is Jack!
HAHAHAH
YOU DON"T even know!
End of file 2