【问题标题】:Cannot get Call to Function Working无法调用函数工作
【发布时间】:2016-12-02 20:44:52
【问题描述】:

我在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 函数以使我有一个不为 NULL 的数组 (rly1f)?文件 RLY1F 存在并且其中包含数据。我之前使用“行内代码”而不是函数成功打开了它。 谢谢

【问题讨论】:

  • printf ("NULL array); exit; 可能无法编译。
  • 目前RLY1F 没有做任何事情。它只是一个空的char * 指针。您需要为其分配文本文件的名称。类似char *RLY1F = "myfile.txt";
  • 请注意rly1fchar 指针 的数组,因此printf ("%c", rly1f[n]); 未定义,因为格式说明符不匹配。

标签: c function input


【解决方案1】:

您遇到的错误是您忘记传递有效的文件名。所以要么程序崩溃,要么fopen 尝试打开一个被删除的名称并返回NULL

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

您将遇到的下一个问题将是在循环中打印字符。

你已经定义了一个指针数组char * rly1f[1500];

您读取了一个文件并将其存储在数组的第一个指针rly1f[0]

但是当你显示它时,你会将指针值显示为字符,这不是你想要的。你应该这样做:

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

注意:如果读取的文件小于 1000,则不会崩溃,但会打印垃圾。 (BLUEPIXY 建议对n BTW 进行后增量修复或跳过第一个字符)

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

puts(rly1f[0]);

编辑:您在读取文件时也遇到了问题。你malloc 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

【讨论】:

  • 当然。无论如何,如果文件较小,那将打印垃圾。我会编辑它(留下来解释 OP 错误,否则他会感到困惑)
  • 另外n 不得超过\0 的索引。
  • 读取文件函数中的分配涵盖了:code = malloc(1500); argh 没有涵盖的是 OP 忽略了他/她文件的实际大小!!!
  • 非常感谢你让我感到困惑。我对数组感到困惑,我认为它的名称是指向它的指针。如果是这样,为什么需要 rly1f[0][n] 不会 rly1f[n] 工作?
  • 不。您已经以某种方式定义了一个数组数组。像二维(不是很学术,只是为了让你理解)。执行rly1f[n] 将为您提供一个未初始化的指针。只有指针数组的第一个元素被初始化。您的结构可以容纳 1500 个文件,每个文件 1500 字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2023-03-16
  • 2016-06-17
相关资源
最近更新 更多