2013-04-26 2 views
1

В настоящее время я могу (я думаю) открыть файл, используя fopen. В целях тестирования я хочу иметь возможность передать содержимое файла в выходной файл, но я не получаю желаемых результатов. Вот какой-то код:Передача входного файла в выходной файл в C?

#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); 

} 

Любая помощь приветствуется.

+0

Ваша программа открывает старый входной файл и новый выходной файл (ну, попытки: 'freopen' здесь неуместно). Однако программа не включает команды, которые будут считывать данные из старого файла и записывать эти данные в новый файл. –

+0

Кстати, почему вы используете 'freopen'? –

+0

Я все еще узнаю об этой теме. Я изменил свой код на fopen. Я также внесу коррективы. Любая идея о том, какие команды мне не хватает? – blutuu

ответ

1

Открытие файлового дескриптора в программе немного отличается от открытия документа в текстовом процессоре. Это больше похоже на открытие книги. Чтобы читать или писать, вы должны использовать свои глаза (потребляя данные) или карандаш (создавая данные).

Поскольку файлы открыты, вам необходимо прочитать данные из первого файла и записать их во второй файл. Что-то вроде:

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 на new_file. freopen не неправильный как таковой, но это weird и будет путать других (включая меня).

Функция freopen() открывает файл, имя которого является строка указывает на по пути и связывает поток, на который указывает поток с ним. Исходный поток (если он существует) закрыт. Аргумент mode используется только , как и в функции fopen(). src: manpage

Таким образом, он откроет поток, как вы пожелаете, но он разрушает stdout, когда он это делает. Таким образом, ваша программа больше не может выполнять нормальный выход. Это может быть неважно, но тогда, похоже, не существует никакого реального преимущества.

+0

Неужели я этого не делаю? – blutuu

+1

Не здесь. Вы * открываете * файл. Теперь вам нужно прочитать данные из него либо с помощью «fgets», либо «fread» или что-то еще. Затем напишите его в new_file с помощью 'fputs' или' fwrite' или что-то еще. –

+0

Эй, это здорово. Я закончил тем, что не отрывал цикл do/while и просто использовал fgets и fputs. Я также использовал strtok, чтобы помочь с функциональностью. Благодарю. Редактировать: strtok на самом деле не нужен. – blutuu

1

Я создал небольшой файл Си похожий на ваш, надеюсь, это поможет вам получить лучшее понимание того, в/о в С.

Код:

#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"); 
} 

Я сделал текстовый файл с именем теста в тот же каталог и просто написал какой-то мусор. Это результат.

Выход:

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 
+0

Мне это нравится. Я обязательно посмотрю на это, когда я воплощу это в свой последний код. +1 – blutuu