当我尝试在 Ubuntu 22.04 中使用 Makefile 编译文件时,如何解决“错误:‘FILE’没有名为‘_ptr’的成员”?

问题描述 投票:0回答:1

我在这里遇到了一个新问题。我正在尝试编译一个 C 文件,其中有一个部分使用 FILE 结构中的 _ptr 指针从文件“users.txt”中读取信息。主要问题是当我尝试编译文件时,我在终端中遇到了下一个错误:错误:'FILE'没有名为'_ptr'的成员,而我得到的错误是:make:*** [ Makefile:16: main.o] 错误 1

这是Makefile

ASM_SOURCE = functions.asm
C_SOURCE = main.c
OBJ_FILES = main.o functions.o

EXEC_RELEASE = main_release.bin
EXEC_DEBUG = main_debug.bin

release: $(OBJ_FILES)
    gcc -o $(EXEC_RELEASE) $(OBJ_FILES)

debug: $(OBJ_FILES)
    gcc -g -o $(EXEC_DEBUG) $(OBJ_FILES)

main.o: $(C_SOURCE)
    gcc -c $(C_SOURCE)

functions.o: $(ASM_SOURCE)
    nasm -f elf64 -o functions.o $(ASM_SOURCE)

clean:
    rm -f $(OBJ_FILES) $(OBJ_FILES) $(EXEC_DEBUG)

这是我尝试在 C 文件中运行的部分 请忽略用西班牙语写的文字,我正在和朋友一起编码。

// Include section on the top of the file
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

// main part of the file
users = calloc(5, sizeof(char*)); // Creando espacio para los usuarios
            flag = LECTURA_INCOMPLETA; // Asignando la bandera a 0
            i = 0; // Rastrear el valor del buffer main
            while(1)
            {
                // Apuntar al primer char
                linea = file.f1 -> _ptr;
                n = 0; // Definiendo el valor de estos en 0

                //CONTAR HASTA QUE ENCUENTRE UN SALTO DE LINEA, FIN DE LINEA, O QUE YA ENCONTR� EL ULTIMO CARACATER DEL ARCHIVO
                while(linea[n] != '\n' && linea[n] != '\0' && (linea+n+1) != fin)
                {
                    n++;
                }
                n+=1;

                bufferAuxiliar = calloc(n, sizeof(char));
                users[i] = calloc(n, sizeof(char)); // Creando espacio en la posici�n i con n longitud de chars

                //COPIAR CARACTER POR CARACTER con FGETC, SE PODRIA USAR FGETS
                for(j = 0; j < n; j++)
                {
                    bufferAuxiliar[j] = fgetc(file.f1);
                    users[i][j] = bufferAuxiliar[j]; // Copiando cada char de bufferAuxiliar en Base de datos

                    //CAMBIAR SALTO DE LINEA POR CARACATER VACIO PARA IMPRESION
                    if(bufferAuxiliar[j]=='\n')
                    {
                        bufferAuxiliar[j] = '\0';
                    }
                    if(bufferAuxiliar[j] == EOF)
                    {
                        //INDICAR QUE YA SE LLEGO AL FINAL DEL ARCHIVO
                        flag = LECTURA_COMPLETA;

                        //SUSTITUIR EOF POR CARACTER VACIO PARA IMPRESION
                        bufferAuxiliar[j] = '\0';
                    }
                }
                i++; // Limpiando archivo
                free(bufferAuxiliar); // Limpiando buffer auxiliar

                //TERMINAR DE LEER LINEAS EN EL ARCHIVO
                if(flag == LECTURA_COMPLETA)
                {
                    return users; // Retorno de la informaci�n
                }
            }
        }
        else
        {
            return 0; // fail
        }
    }
    else
    {
        return 0; // fail
    }

希望大家能帮助我,我将不胜感激。

我尝试在终端中出现错误的 Makefile 行上使用命令 -l 和 -L。 示例:

C_SOURCE = main.c
main.o: $(C_SOURCE)
    gcc -L stdio. h-c $(C_SOURCE)
c pointers makefile ubuntu-22.04
1个回答
0
投票

FILE
是一种不透明类型:这意味着您无法可移植地取消引用
FILE *
并访问其成员。结构内容未记录,因此尝试访问没有意义
file.f1 -> _ptr

© www.soinside.com 2019 - 2024. All rights reserved.