C программа для обратного содержимого файла и записи этого в другой файл
У меня возникли проблемы с заданием, когда я должен взять содержимое одного файла в буфер, перевернуть его и записать в другой файл. Эта программа нуждается в использовании двух функций, которые выглядят следующим образом:
int read_file( char* filename, char **buffer );
int write_file( char* filename, char *buffer, int size);
пока мои файлы выглядят так:
file_utils.h
#ifndef UTILS_H
#define UTILS_H
int read_file(char* filename, char **buffer);
int write_file(char* filename, char *buffer, int size);
#endif
file_utils.c
#include "file_utils.h"
#include <stdlib.h>
#include <stdio.h>
#include <font1.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
int read_file(char* filename, char **buffer) {
FILE* file1;
file1 = fopen(filename, "r");
//gets the size of the file
struct stat st;
stat(filename, &st);
int size = st.st_size;
buffer = malloc(size);
read(file1, &buffer, 1);
return size;
}
int write_file(char* filename, char*buffer, int size) {
FILE* file2;
file2 = fopen(filename, 'w');
for (int k = size - 1; k >= 0; k--) {
char* x = &buffer + k;
fprintf(file2, "%s", x);
}
printf(filename, '\O');
return 1;
}
reverse.c
#include "file_utils.h"
#include <stdlib.h>
#include <stdio.h>
#include <font1.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
char* buffer;
char* filename1;
char* filename2;
int filesize;
filename1 = argv[1];
filename2 = argv[2];
filesize = read_file(filename1, &buffer);
write_file(filename2, buffer, filesize);
return 0;
}
и это все, что есть. Я запускаю его с помощью "clang file_utils.c reverse.c" и получаю предупреждения для file_utils.c, например
incompatible integer to pointer conversion passing 'int" to parameter of type 'const char *'
(для строки file1 = fopen(имя файла, 'r')incompatible pointer to integer conversion passing 'FILE *' (aka 'struct_IO_FILE*') to parameter of type 'int'
(для прочитанной строки (file1, &buffer, 1);)- то же предупреждение, что и первое, но для строки file2 = fopen(filename, 'w');
- а также
incompatible pointer types initializing 'char *' with an expression of type 'char **'; dereferences with *
(для строки char* x = &buffer + k;)
помимо всего этого, когда я продолжаю запускать исполняемый файл как таковой
./a.out file1 file2
где файл 1 содержит текст, который должен быть преобразован в файл 2, я получаю ошибку сегментации.
Любое понимание вещей, которые я могу исправить, будет высоко ценится.
3 ответа
Просто без головы, без тестирования, я вижу эти ошибки:
buffer = malloc(size);
должно быть *buffer = malloc(size);
... так как buffer
это указатель на указатель на char
Вам нужно разыменовать его один раз.
read(file1, &buffer, 1);
должно быть fread(*buffer, 1, size, file1);
... потому что ты открыл file1
с fopen
, так что это FILE *
, read
Unix I/O, не потоковый I / O, и не использует FILE *
,
file2 = fopen(filename, 'w');
должно быть file2 = fopen(filename, "w");
Второй аргумент должен быть "строкой" (указатель на char
или массивchar
). 'w'
это один char
,
char* x = &buffer + k;
должно быть char *x = buffer + k;
buffer
это указатель на char
, так что вы хотите использовать его напрямую, а не брать его адрес. Также обратите внимание на стиль нанесения *
рядом с переменной вместо типа. Это хорошая привычка, потому что это не означает одно и то же:
char *a, *b, *c; /* three pointers */
char* a, b, c; /* one pointer, two chars */
fprintf(file2, "%s", x);
должно быть fprintf(file2, "%c", *x);
Первая форма относится x
как начало строки и будет выводить все, начиная с этой точки, до тех пор, пока она не достигнет терминатора NUL. Вы хотите вывести только один char
так что используйте %c
спецификатор и разыменование x
чтобы получить char
,
Лучший способ был бы fwrite(x, 1, 1, file2);
printf(filename, '\O');
не нужен и не делает то, что вы думаете. Похоже, вы намеревались написать NUL в конце. Это было бы'\0'
(ноль), не '\O'
(буква О). В любом случае, это не нужно или не нужно. NUL используется для завершения строки в C, а не файла. Ваш выходной файл будет на один символ длиннее, чем должен быть, если вы сделаете это.
Самая важная проблема с вашим кодом здесь
char* x = &buffer + k;
fprintf(file2, "%s", x);
возможно ты имеешь ввиду
char *x = buffer + k;
fprintf(file2, "%c", *x);
Вы также смешиваете функции ввода-вывода. Для FILE *
объект, который вы должны использовать fread()
вместо read()
, должно быть предупреждение о несовместимых аргументах от компилятора.
Если нет предупреждений (кстати char *x = &buffer + k
должно вызвать другое предупреждение), тогда вам, вероятно, следует включить их явно, чтобы ваш компилятор помог вам разобраться в других проблемах.
Кроме того, проверьте, что file1
не является NULL
после fopen()
, Проверь это fread()
прочитал запрашиваемую сумму, в общем проверил каждую возможную ошибку, которую вы можете легко вывести из возвращаемого значения подразумеваемой функции, если вы не знаете значения такого значения, ПРОЧИТАЙТЕ ДОКУМЕНТАЦИЮ перед использованием такой функции.
И наконец все вместе:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
int read_file(char* filename, char **buffer) {
FILE* file1;
file1 = fopen(filename, "r");
//gets the size of the file
struct stat st;
stat(filename, &st);
int size = st.st_size;
*buffer = malloc(size);
fread(*buffer, size, 1, file1);
fclose(file1);
return size;
}
void write_file(char* filename, char*buffer, int size) {
FILE* file2 = fopen(filename, "w"); int k;
for (k = size - 1; k >= 0; k--) {
fwrite(buffer + k, 1, 1, file2);
}
fclose(file2);
}
int main(int argc, char *argv[]) {
char* buffer;
char* filename1;
char* filename2;
int filesize;
filename1 = "input.txt";
filename2 = "reverse.txt";
filesize = read_file(filename1, &buffer);
write_file(filename2, buffer, filesize);
free(buffer);
return 0;
}
с живой демонстрацией. Пожалуйста, добавьте проверки для всех возвращаемых значений, как malloc()
не возвращается NULL
,