C程序反转文件内容并将其写入另一个文件
C program to reverse content of a file and write that to another file
我在分配时遇到问题,我必须将一个文件的内容放入缓冲区,反转这些内容,然后将它们写入另一个文件。该程序需要使用如下两个函数:
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(filename, 'r')
incompatible pointer to integer conversion passing 'FILE *' (aka 'struct_IO_FILE*') to parameter of type 'int'
(对于行 read(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 中,我遇到了分段错误。
任何对我可以解决的问题的见解都将不胜感激。
您的代码最重要的问题在这里
char* x = &buffer + k;
fprintf(file2, "%s", x);
也许你的意思是
char *x = buffer + k;
fprintf(file2, "%c", *x);
你也在混合IO函数。对于 FILE *
对象,您应该使用 fread()
而不是 read()
,编译器应该会发出 incompatible arguments 警告。
如果没有警告(BTW char *x = &buffer + k
应该触发另一个警告),那么你应该显式启用它们,以便你的编译器可以帮助你找出其他问题。
此外,检查 file1
不是 NULL
在 fopen()
之后,检查 fread()
是否读取了请求的数量,通常检查您可能出现的每一个错误可以很容易地从隐含函数的 return 值推断出,如果您不知道此类值的含义,请在使用此类函数之前阅读文档。
就在我的脑海中,没有测试,我看到了这些错误:
buffer = malloc(size);
应该是 *buffer = malloc(size);
...因为buffer
是指向char
的指针,你需要
取消引用一次。
read(file1, &buffer, 1);
应该是 fread(*buffer, 1, size, file1);
...因为你用fopen
打开了file1
,所以是FILE *
。 read
是
Unix I/O,不是流 I/O,也不使用 FILE *
。
file2 = fopen(filename, 'w');
应该是 file2 = fopen(filename, "w");
第二个参数应该是 "string"(指向 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 。那将是
'[=42=]'
(零),而不是 '\O'
(字母 O)。在任何情况下,都不需要或
通缉。 NUL 用于终止 C 中的字符串,而不是文件。你的输出
如果您这样做,文件将比应有的长度长一个字符。
最后在一起:
#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;
}
带直播demo。请为所有 return 值添加检查,例如 malloc()
不会 return NULL
.
我在分配时遇到问题,我必须将一个文件的内容放入缓冲区,反转这些内容,然后将它们写入另一个文件。该程序需要使用如下两个函数:
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(filename, 'r')incompatible pointer to integer conversion passing 'FILE *' (aka 'struct_IO_FILE*') to parameter of type 'int'
(对于行 read(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 中,我遇到了分段错误。
任何对我可以解决的问题的见解都将不胜感激。
您的代码最重要的问题在这里
char* x = &buffer + k;
fprintf(file2, "%s", x);
也许你的意思是
char *x = buffer + k;
fprintf(file2, "%c", *x);
你也在混合IO函数。对于 FILE *
对象,您应该使用 fread()
而不是 read()
,编译器应该会发出 incompatible arguments 警告。
如果没有警告(BTW char *x = &buffer + k
应该触发另一个警告),那么你应该显式启用它们,以便你的编译器可以帮助你找出其他问题。
此外,检查 file1
不是 NULL
在 fopen()
之后,检查 fread()
是否读取了请求的数量,通常检查您可能出现的每一个错误可以很容易地从隐含函数的 return 值推断出,如果您不知道此类值的含义,请在使用此类函数之前阅读文档。
就在我的脑海中,没有测试,我看到了这些错误:
buffer = malloc(size);
应该是 *buffer = malloc(size);
...因为buffer
是指向char
的指针,你需要
取消引用一次。
read(file1, &buffer, 1);
应该是 fread(*buffer, 1, size, file1);
...因为你用fopen
打开了file1
,所以是FILE *
。 read
是
Unix I/O,不是流 I/O,也不使用 FILE *
。
file2 = fopen(filename, 'w');
应该是 file2 = fopen(filename, "w");
第二个参数应该是 "string"(指向 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 。那将是
'[=42=]'
(零),而不是 '\O'
(字母 O)。在任何情况下,都不需要或
通缉。 NUL 用于终止 C 中的字符串,而不是文件。你的输出
如果您这样做,文件将比应有的长度长一个字符。
最后在一起:
#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;
}
带直播demo。请为所有 return 值添加检查,例如 malloc()
不会 return NULL
.