我遇到了一个分配问题,我必须将一个文件的内容放入缓冲区,反转这些内容,然后将它们写入另一个文件。该程序需要使用两个看起来像这样的函数:
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'
(对于读取的行(file1,&amp; buffer,1);)incompatible pointer types initializing 'char *' with an expression of type 'char **'; dereferences with *
(对于行char * x =&amp; buffer + k;)除此之外,当我继续运行可执行文件时
./a.out file1 file2
其中文件1的文本应该反转到文件2中,我遇到了分段错误。
对我能解决的事情的任何见解将不胜感激。
答案 0 :(得分: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");
第二个参数应该是&#34;字符串&#34; (指向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'
(字母O)。在任何情况下,都不需要或
通缉。 NUL用于终止C中的字符串,而不是文件。你的输出
如果你这样做,文件将比一个字符长一个字符。
答案 1 :(得分:2)
您的代码最重要的问题是
char* x = &buffer + k;
fprintf(file2, "%s", x);
也许你的意思是
char *x = buffer + k;
fprintf(file2, "%c", *x);
您也正在混合使用IO功能。对于FILE *
对象,您应该使用fread()
而不是read()
,编译器应该发出不兼容的参数警告。
如果没有警告( BTW char *x = &buffer + k
应该触发另一个警告),那么您应该明确启用它们,以便编译器可以帮助您找出其他问题。
另外,检查file1
之后NULL
是否fopen()
,检查fread()
是否读取了请求的金额,通常会检查每个可能容易出错的错误从隐含函数的返回值推断出来,如果你不知道这个值的含义,那么在使用这个函数之前先阅读文档。
答案 2 :(得分:0)
最后一起:
#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。请为所有返回值添加检查,例如malloc()
不返回NULL
。