C 从文件转换文本

C 从文件转换文本,c,function,C,Function,我正在做一个项目,我需要将文本从文件转换成莫尔斯。为此,我将字母表及其相应的摩尔斯电码(也在一个文件中)存储到一个结构中 文件“original.txt”类似于: My name is Olivia We are in 2019 3 plus 4 is 7 文件“morse.txt”是: 等等 现在我唯一的问题是: warning: comparison between pointer and integer > if (line[i] == l[j].letters){ (line

我正在做一个项目,我需要将文本从文件转换成莫尔斯。为此,我将字母表及其相应的摩尔斯电码(也在一个文件中)存储到一个结构中

文件“original.txt”类似于:

My name is Olivia
We are in 2019
3 plus 4 is 7
文件“morse.txt”是:

等等

现在我唯一的问题是:

warning: comparison between pointer and integer 
> if (line[i] == l[j].letters){ (line 25)`
#包括
#包括
#包括
#包括
/*常数*/
#定义T_MORSE 8
#定义Q_字母26
#定义Q_数10
#定义Q_摩尔斯(Q_字母+Q_数字)
#定义最大字符串大小50
typedef结构{/*需要字符串结束符的位置\0*/
字符字母[5];/*存储字母,将其作为字符串获取,但仅使用第一个字母*/
char lettersMorse[T_MORSE];/*存储字母的相应莫尔斯符号*/
}字母表;
字母l[Q_MORSE];
无效进程(常量字符*行){
int j,i;
对于(i=0;行[i];++i){
对于(j=0;j<37;++j){//莫尔斯字母向量
if(第[i]==l[j]行,字母){
printf(“%s”,l[j]。lettersMorse);
printf(“”;}
}
}
}
int main(){
int cont=0,j;
文件*arch;
arch=fopen(“morse.txt”、“r”);
if(arch==NULL){
printf(“错误”);
返回0;
}
否则{
while(fscanf(拱形,“%s%s”,l[cont]。字母,l[cont]。字母数)!=EOF){
l[cont]。字母[1]='\0';/*消除不需要的字符*/

对于(j=0;j严格回答问题,不进行其他代码审查:

if(第[i]==l[j]行.字母)

这里的问题是
line
是一个字符串,因此
line[i]
是一个单个字符(在C中也是一个整数,因此是关于整数的警告文本)。但是
letters
是一个字符串,它是一个字符数组,在这样的上下文中被视为指向字符的指针(因此是关于指针的警告文本)

阅读代码中的一条注释时,您希望第一个字符是
字母
,因此:


if(第[i]==l[j]行,字母[0])

您的莫尔斯字母表定义文件包含哪些内容?阅读文件后,
l
的内容是否正确?您提供了37个符号的空间。这足以容纳26个字母、10个数字和1个其他字符。如何处理大写/小写字母?顺便说一句:使用像
37
这样的硬编码幻数是一个好方法在大多数情况下,这不是一个好主意。您应该定义一个宏,并在需要数字的每个地方使用它。您可能希望读取带有以下字母的文件:a.-B-…C-。-.D-…等(每个字母在另一个字母下面)在l[i]字母中,我存储了拉丁字母,在l[i]字母中,字母分别对应摩尔斯电码。两者都是在结构字母表中。这就是我想存储它们的原因。昨天我尝试时,它都没问题,但现在它只读取字母A…Ognum,为什么代码不检查
fscanf(arch,…)的返回值
?为什么使用
fscanf()
的循环允许超过37次迭代?我不知道…我之所以输入37次,是因为26个字母和10个数字。这是我的教授给我的文件,我无法修改。我需要做的是将字母存储到结构中,但我不知道为什么我的输入方式不起作用。。。
warning: comparison between pointer and integer 
> if (line[i] == l[j].letters){ (line 25)`
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>

    /* Constants */
    #define T_MORSE 8
    #define Q_LETTERS 26
    #define Q_NUMBERS 10
    #define Q_MORSE (Q_LETTERS+Q_NUMBERS)
    #define MAX_STRING_SIZE 50



    typedef struct{          /* needs a position to the string finisher \0               */
        char letters[5];     /* stores the letters , get it as a string , but use only the first letter */
        char lettersMorse[T_MORSE];/* stores the respective morse symbols of the letters                 */
    }alphabet;
    alphabet l[Q_MORSE];

    void process(const char *line) {
        int j, i;
        for (i = 0; line[i]; ++i) {
            for ( j = 0; j < 37; ++j ){      //vector for morse letters
             if (line[i] == l[j].letters){
              printf("%s", l[j].lettersMorse);
              printf("   ");}
            }
        }
    }

    int main(){
        int cont=0,j;
        FILE *arch;
        arch = fopen("morse.txt","r");
        if( arch == NULL ){
            printf("ERROR");
            return 0;
        }
        else{
            while(fscanf(arch,"%s%s",l[cont].letters,l[cont].lettersMorse) != EOF){
                l[cont].letters[1] = '\0';                            /* eliminates unwanted characters           */
                for(j=0; j<strlen(l[cont].lettersMorse); j++){
                    if(l[cont].lettersMorse[j] == '*'){               /* if an asterisk is found                */
                       l[cont].lettersMorse[j] = '\0';                /* eliminate asterisk                   */
                       break;
                    }
                }

                cont++;                                             /*points to the next position of the vector     */
            }
        }
        fclose(arch);

        FILE *fp;
        char line[MAX_STRING_SIZE];
        fp = fopen("original.txt", "r");
        if (arch==NULL){
        printf("ERROR");}
        while (fgets(line,MAX_STRING_SIZE,fp) != NULL) {
        process(line);
        }
        fclose(fp);

        return 0;
    }

'''