我的功能有问题.基本上,我需要将多项式从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++相关问答推荐

Ruby C Api处理异常

我在这里正确地解释了C操作顺序吗?

文件权限为0666,但即使以超级用户身份也无法打开

Setenv在c编程中的用法?

错误Cygwin_Except::Open_stackdupfile:正在转储堆栈跟踪是什么?

如何使解释器存储变量

不同原型的危险C函数是可能的

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

隐藏测试用例无法在c程序中计算位数.

try 查找带有指针的数组的最小值和最大值

Makefile无法将代码刷新到ATmega328p

C语言中的指针和多维数组

在 C 中传递参数时出现整数溢出

仅使用其内存地址取消引用 C 中的 struct

如何确定 C 程序中的可用堆内存

char* 上的 free() 被 valgrind 识别为无效

C 语言支持 DirectX 9 或 DirectX 11 吗?

为什么C中的gethostname函数会导致清除路径环境变量?

使用便携式的C语言模拟打包 struct

srand/rand 缓慢变化的起始值