用C语言读取输入文件

用C语言读取输入文件,c,file-io,C,File Io,我需要通过使用C编程语言读取输入文件来完成我的一项作业 这是我的密码: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char *input = readFromFile(argv); return 0; } char *readFromFile(char *argv[]) { FILE *fp; fp = fopen(argv[1],

我需要通过使用C编程语言读取输入文件来完成我的一项作业

这是我的密码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char *input = readFromFile(argv);
    return 0;
}

char *readFromFile(char *argv[])
{
    FILE *fp;
    fp = fopen(argv[1],"r");
    char *input, c;
    int i = 0;

    while(!feof(fp))
    {
        c = fgetc(fp);
        input[i++] = c;
    }
    fclose(fp);
    return input;
}
我想在另一个函数中执行此读取操作,而不是在主函数中。我试过了,但做不到

当我尝试使用上面的代码时,会收到一条错误消息,上面说:

readFromFile的冲突类型

如何修复此错误并执行所需操作?

在使用readFromFile之前,必须先声明readFromFile。最好的方法是添加一个原型:

char *readFromFile(char *argv[]); /* note that the identifier is useless here */
注意:顺便说一句,您的源代码中还有很多其他错误。主要的一点是,您不为输入分配内存。因此,您将尝试取消对统一化指针的引用:这将导致未定义的行为。由于要返回指针,因此需要使用动态分配

#include <stdlib.h>
char *input = malloc(SIZE);

此外,您对feof的使用是错误的。

首先,您可以在以下两项中进行选择:

一,。声明功能原型; 2.在main之前声明函数

这样,函数就可以在main中识别。为了快速起见,我总是在main之前声明函数。在readFromFile中,您没有分配所需的内存,请为您修复它:

#include <stdio.h>
#include <stdlib.h>

char *readFromFile(char *argv[])
{
    FILE *fp;
    fp = fopen(argv[1],"r");
    char *input, c;
    int i = 0;
    size_t size=100*sizeof(char);
    input=(char*)malloc(size);

    while( (c = fgetc(fp)) != EOF )
    {
        if(++i == size)
        {
            size+= 100*sizeof(char);
            input=(char*)realloc(input,size);
        }
        input[i-1] = c;
    }
    fclose(fp);
    return input;
}

int main(int argc, char *argv[])
{
    char *input = readFromFile(argv);
    return 0;
}

您正在取消引用未初始化的指针输入。。。这会崩溃的。费奥夫完全错了。确保你明白这一点。在你写简历之前不要把C写在简历上。伍德在命令箭头后面写道,随着语言教学的不断变化,学术界应该被要求教授调试技术。此代码从不检查fopen的结果,错误地使用feof,通过未初始化的指针写入随机内存,在读取期间不执行边界检查,并使用假定的函数decl,因为在main中使用readFromFile之前没有原型。当我尝试使用main函数中相同的代码从文本文件中读取时,它工作了。所以,我认为readFromFile函数中的代码没有错误。我会考虑你的答案,阅读并尝试理解你所说的FEF函数。谢谢你…将会有很多运行时错误。但是,当我在主函数之前添加原型时,我个人不再有编译错误。你是否将原型放在主函数之上?当我像你一样声明它并尝试运行程序时,它立即停止工作。因此,不再有编译错误。查看我的编辑和注释。他正在返回输入,输入必须在堆或全局上。您的重新分配策略不是很有效,顺便说一句sizeofchar和malloc cast都是无用的。@Kirilenko说到CPU,我的重新分配策略是有效的。您应该知道,重新分配占用大量CPU,所以不要在每个字符上重新分配,我分配100字节的块。100 B在现代RAM中什么都不是。关于强制转换,这是为了使编译器警告静音,而sizeofchar是因为不是每台机器上都有一个字符。你应该知道,每本书都有这个链接。@RamyAlZuhouri:你错了。1有效的再分配应使用几何级数。请点击此处:。2该演员在C中无效,并且不会报告任何警告。您可能正在编译一个C++编译器。3 sizeofchar始终为1。并非总是8位,而是字符位。买另一本书-重新分配策略取决于你对文件的内容,你不能说几何级数是最好的策略。如果你的文件上有100B的块,那么这是最好的策略,顺便说一句,我无法访问你的法语文件。然而,您从函数返回堆栈上分配的内存,有可能溢出缓冲区并出现语法错误,然后质疑这些细节,就像强制转换一样,我的编译器给了我一个警告,那么?还有效率。我认为这简直是可笑。