无法打电话工作

问题描述:

我发现这段代码在Reading a file character by character in C,它编译并且是我想要使用的。我的问题是我无法获得正确的呼叫。代码如下:无法打电话工作

char *readFile(char *fileName) 
{ 
    FILE *file = fopen(fileName, "r"); 
    char *code; 
    size_t n = 0; 
    int c; 

    if (file == NULL) 
     return NULL; //could not open file 
    code = malloc(1500); 

    while ((c = fgetc(file)) != EOF) 
    { 
     code[n++] = (char) c; 
    } 
    code[n] = '\0'; 

    return code; 
} 

我不确定如何调用它。目前我使用下面的代码来调用它: .....

char * rly1f[1500]; 
char * RLY1F; // This is the Input File Name 
rly1f[0] = readFile(RLY1F); 
if (rly1f[0] == NULL) { 
    printf ("NULL array); exit; 
} 
int n = 0; 
while (n++ < 1000) { 
    printf ("%c", rly1f[n]); 
} 
..... 

如何调用ReadFile函数,使得我有一个数组(rly1f),这是不为空?文件RLY1F存在并且包含数据。我已经成功地打开它以前使用'在线代码'不是一个函数。 谢谢

+2

'printf(“NULL array”; exit;'could not compile。 – Downvoter

+1

当前'RLY1F'没有做任何事情,它只是一个空的'char *'指针,你需要为它指定文本文件的名字。像'char * RLY1F =“myfile.txt”;' – RoadRunner

+1

注意''rly1f'是一个'char' **指针**的数组,所以'printf(“%c”,rly1f [n]);'是未定义,因为您的格式说明符不匹配。当然是 – Downvoter

您遇到的错误是您忘记传递有效的文件名。因此,无论程序崩溃,或fopen试图打开一个丢弃的名字,并返回NULL

char * RLY1F; // This is not initialized! 
RLY1F = "my_file.txt"; // initialize it! 

你必须将你的循环打印字符的下一个问题。

您已定义指针char * rly1f[1500];

您读取1个文件并将其存储在所述阵列rly1f[0]

的第一指针但是,当你显示它你显示指针值的阵列作为字符,这是不你想要什么。你应该只是做:

while (n < 1000) { 
    printf ("%c", rly1f[0][n]); 
    n++; 
    } 

注:这不会崩溃,但如果文件读取短于1000 (BLUEPIXY建议的递增后的修复程序n BTW或第一个字符是跳过)

将打印垃圾

所以做更简单,因为你的字符串是空终止,该数组传递给puts

puts(rly1f[0]); 

编辑:读取文件时太你有问题。您需要1500字节,但您完全阅读文件。如果文件大于1500字节,则会发生缓冲区溢出。

你必须计算之前分配内存的长度。比如像这(使用stat将可能是更好的选择):

char *readFile(char *fileName, unsigned int *size) { 
... 
fseek(file,0,SEEK_END); // set pos to end of file 
*size = ftell(file); // get pos, i.e. size 
rewind(file); // set pos to 0 
code = malloc(*size+1); // allocate the proper size plus one 

注意额外的参数,它允许你返回的大小以及文件数据。

注:在Windows系统上,文本文件使用\r\n(CRLF)来界定线,所以所以有少字符分配的尺寸会比(如果你用文本方式阅读的字符数\r\n转换为\n更高在你的缓冲区中:一旦你知道了确切的大小来删除未使用的分配空间,你可以考虑一个realloc)。

+0

。无论如何,如果文件较小,那会打印垃圾。我会编辑它(留下来解释OP错误,否则他会感到困惑) –

+0

另外'n'不能超过'\ 0'的索引。 – BLUEPIXY

+0

这是由读文件函数中的分配所覆盖的:'code = malloc(1500);''''''''''''那么OP会忽略他/她的文件的实际大小! –