【发布时间】:2015-02-21 04:52:07
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int count_arr(FILE *file)
{
int c,count=0;
//FILE *file;
//file = fopen("test.txt", "r");
if (file) {
while ((c = getc(file)) != EOF){
putchar(c);
++count;}
fclose(file);
}
return count;
}
void make_arr (FILE *file, char arr[]){
int c,n=0,count=0;
char ch;
//FILE *file;
//file = fopen("test.txt", "r");
if (file) {
while ((c = getc(file)) != EOF){
ch = (char)c;
arr[n]=ch;
++n; }
fclose(file);
}
}
int main(){
FILE *file;
int n;
//scanf("%c",&file_name);
file = fopen("test.txt","r");
int count = count_arr(file);
char arr [count];
make_arr(file, arr);
for(n=0; n<count;++n) printf("%c",arr[n]);
}
到目前为止,这就是我的代码的全部内容。我知道我做错了。当我打印出 char 数组时,它会打印出随机垃圾...我正在尝试编写一个函数“make_arr”,该函数传递一个数组,该数组与文件中的字符一起存储。任何帮助,将不胜感激!
【问题讨论】:
-
可以通过
fseek(file, 0, SEEK_END); int size = ftell(file); fseek(file, 0, SEEK_SET);获取文件大小,然后分配内存,读取整个文件char* arr = malloc(size); fread(arr, size, 1, file);。不要忘记关闭文件并释放缓冲区。 -
代码在 main() 中打开了文件,所以它应该在 main() 中关闭,而不是在两个子函数中。 main() 可以轻松地倒回文件,因此 make_arr() 可以在调用 count_arr() 后立即使用 fseek(file, 0, SEEK_SET) 函数调用再次读取它
-
使用 fseek(file, 0, SEEK_END); ftell(file) 将在两行代码中给出文件中的字节数,并且比逐字节读取文件要快得多。那么函数 count_arr() 可以被消除
-
在向全世界展示您的代码之前,请正确格式化/缩进。
-
如果你没有打开
count_arr()中的文件,你不应该关闭它。这样做意味着您在调用count_arr()后无法使用文件指针。经验法则:在打开文件的函数中关闭文件(仅)。显然,如果函数的目的是打开一个文件并返回打开的文件流,则经验法则不适用。如果您的函数传递了一个打开的文件流,则不应关闭它。如果您的函数自己打开一个文件流,它应该关闭它或返回它(否则会泄漏文件流)。