传递参数2,3使得指针来自整数而没有强制转换

时间:2015-09-20 10:25:15

标签: c pointers casting

使用C和Netbeans 8.0.2语言我尝试读取两个文件中的一组字符并将这些字符传递给一个名为Patmat的方法,用于比较它们。

Patmat方法有三个参数.int参数是可能存在的不匹配数,其他两个字符参数是文件内容。

以下是我从文章中得到的Patmat方法,其中有一个很长的过程可供比较。

int Patmat(int k, char *pattern, char *text){
}

这是我的主要方法

int main() {   
    FILE *fp1;
    FILE *fp2;

    char c;
    char c2;

    fp1= fopen ("file1.txt","r");
    fp2= fopen("file2.txt","r");

    while(1)
    {
        c = fgetc(fp1);
        if(c==EOF)
            break;
        else
            printf("%c", c); 
    }

    while(1)
    {
        c2 = fgetc(fp2);
        if(c2==EOF)
            break;
        else
            printf("%c", c2); 
    }
    fclose(fp1);
    fclose(fp2); 
    **// Patmat(0,&c,&c2);
    Patmat(0,c,c2);**
    return 0;   
}

由于我不太熟悉C和指针,任何人都可以帮助我将两个文件的字符集传递给Patmat方法吗?它不像上面那样工作。

两个文件的内容是:

file1.txt: AGGTACCGTA
file2.txt: AGGTACCGTA

我直接将这些参数传递为Patmat(0,"AGGTACCGTA","AGGTACCGTA")。它工作正常,并将答案返回1,这是正确的。

但是现在我想从文件中读取这些字符集并将它们传递给Patmat方法。它给出了以下警告:

warning: passing argument 3 of 'Patmat' makes pointer from integer without a cast
 warning: passing argument 2 of 'Patmat' makes pointer from integer without a cast

如果我感到不便,请提前致谢并表示歉意。这是我第一次在这里发帖提问。

2 个答案:

答案 0 :(得分:2)

如果您想要阅读整个文件,char(一个字符)不是您想要的。在这种情况下,您希望将文件的内容读入数组。

char *buffer[1024]; // for example
int result = fread(buffer, 1, 1024, fp1);

现在缓冲区包含可以传递给Patmat函数的文件内容

Patmat(0, buffer, buffer2); // buffer2 goes the same way

如果您想要一次读取整个文件(对较小的文件很有用),您还可以动态分配buffer。还要确保设置null终止符。

更新:一个例子是:

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

#define BUFSZ 32

void patmat(int k, char *pattern, char *text) {
    /* Compare or do something here */
    printf("K %d\nPattern %s\nText %s\n", k, pattern, text);
}

int main(int argc, char *agrv[]) {
    FILE *fp1 = NULL;
    FILE *fp2 = NULL;

    char buffer[BUFSZ];
    char buffer2[BUFSZ];

    if (!(fp1 = fopen("file1.txt","r"))) {
        perror("open file");
        return 1;
    }
    if (!(fp2 = fopen("file2.txt","r"))) {
        perror("open file");
        return 1;
    }

    size_t result = fread(buffer, 1, BUFSZ, fp1);
    if (!result)
        puts("reading error");

    size_t result2 = fread(buffer2, 1, BUFSZ, fp2);
    if (!result)
        puts("reading error");

    buffer[result-1] = '\0';
    buffer2[result2-1] = '\0';

    patmat(0, buffer, buffer2);

    fclose(fp1);
    fclose(fp2);
    return 0;
}

这只是一个例子,还有其他/更好的方法。

答案 1 :(得分:0)

while(1)
    {
        c = fgetc(fp1);
        if(c==EOF)
            break;
        else
            printf("%c", c); 
    } // By the time this loop breaks c will be EOF

    while(1)
    {
        c2 = fgetc(fp2);
        if(c2==EOF)
            break;
        else
            printf("%c", c2); 
    } // similar applies to this loop c2 EOF
    fclose(fp1);
    fclose(fp2); 
    **// Patmat(0,&c,&c2);
    Patmat(0,c,c2);// This section is not probably well equipped to provide correct results,  becuase of the EOF 

我怀疑你在寻找的东西是这样的

while( ((c = fgetc(fp1)) != EOF ) &&
       ((c2= fgetc(fp2)) != EOF ) ) {
               printf("%c %c", c, c2); 
               Patmat(0,&c,&c2); 
}

当你打破这个循环时,要么两个文件都被完全读取,要么其中一个文件仍处于EOF状态,这些情况需要在这里处理。