我的功能有问题.基本上,我需要将多项式从file.txt加载到终端.

基本上,我在每行上有几个系数,1个多项式等于1行.当我在终端上try 我的输出是奇怪的.1系数不打印,3行/3多项式也不打印.

下面是我的函数:

polynom* vytvorZeSouboru(const char *soubor, int *pocet) {
    FILE *file = fopen(soubor, "r");

    if (file == NULL) {
        perror("Chyba pri otevirani souboru");
        exit(EXIT_FAILURE);
    }

    // Number of polynomials in the file - set to 0 at the beginning
    *pocet = 0;

    // Find out how many rows (polynomials) are in the file
    int c;
    while ((c = fgetc(file)) != EOF) {
        if (c == '\n') {
            (*pocet)++;
        }
    }

    // Let's go back to the beginning of the file
    rewind(file);

    // Pole polynomů
    Polynom *polePolynomu = (Polynom*)malloc(*pocet * sizeof(Polynom));

    //  Reading polynomials from a file
    for (int i = 0; i < *pocet; ++i) {
        int pocetKoeficientu;
        if (fscanf(file, "%d", &pocetKoeficientu) != 1) {
            fprintf(stderr, "Chyba pri cteni poctu koeficientu polynomu ze souboru.\n");
            exit(EXIT_FAILURE);
        }
       

        // Polynomial initialization
        polePolynomu[i].koeficienty = (int*)malloc(pocetKoeficientu * sizeof(int));
        polePolynomu[i].pocetKoeficientu = pocetKoeficientu;

        // Načtení koeficientů polynomu
        for (int j = 0; j < pocetKoeficientu; ++j) {
            if (fscanf(file, "%d", &polePolynomu[i].koeficienty[j]) != 1) {
                fprintf(stderr, "Chyba pri cteni koeficientu polynomu ze souboru.\n");
                exit(EXIT_FAILURE);
            }
        }
    }

    // Zavření souboru
    fclose(file);

    return polePolynomu;
}

void vypisPolynomy(const Polynom *polePolynomu, int pocet) {
    for (int i = 0; i < pocet; ++i) {
        printf("Polynom %d: ", i + 1);
        for (int j = 0; j < polePolynomu[i].pocetKoeficientu; ++j) {
            printf("%d ", polePolynomu[i].koeficienty[j]);
        }
        printf("\n");
    }
}

int main() {
    int pocet, i;
    
    const char *cestaKSouboru = "vytvorZeSouboru.txt"; 
     
    Polynom *polePolynomu = vytvorZeSouboru(cestaKSouboru, &pocet);
    
    vypisPolynomy(polePolynomu, pocet);

    // Memory release
    for (int i = 0; i < pocet; ++i) {
        free(polePolynomu[i].koeficienty);
    }
    free(polePolynomu);
}

推荐答案

解决一个潜在的问题.

Line count

代码对'\n'的数字进行计数以确定行数.如果最后的lineEOF之前没有最后的'\n',这是一个差一.

或者,计算行首的数量.

*pocet = 0;
int prior = '\n';
int c;
while ((c = fgetc(file)) != EOF) {
  if (prior == '\n') {
    (*pocet)++;
  }
  prior = c;
}

C++相关问答推荐

想了解 struct 指针和空指针转换

来自stdarg.h的c中的va_args无法正常工作<>

如何解决C中的严格别名?

手动矢量化性能差异较大

正在try 将文件/文件夹名从目录 struct 存储到链接列表

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

非正规化边缘毛刺

判断X宏的空性

如何在C中使数组变量的值为常量?

不同出处的指针可以相等吗?

如何在VS 2022中正确安装额外的C头文件

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

如何在C宏定义中包含双引号?

C编译和运行

哪个首选包含第三个库S头文件?#INCLUDE;文件名或#INCLUDE<;文件名&>?

';malloc():损坏的顶部大小';分配超过20万整数后

为什么<到达*时不会转换为>?

为什么写入关闭管道会返回成功

malloc:损坏的顶部大小无法找出问题

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?