fclose()崩溃C程序



我有一个相对简单的程序,该程序在从文件中读取整数后不断崩溃。它在执行FCLOSE线后崩溃。我已经将错误本地化在此功能中。

// Read array from text file
int * fileRead() {
    FILE *file;
    file = fopen("test.txt", "r");
    // Check if the file exists
    if(file == NULL){
        printf("There was a problem opening the file");
        exit(1);
    }
    // Count number of lines in file
    int count = 0;
    char c;
    for (c = getc(file); c != EOF; c = getc(file)){
        if (c == 'n') { 
            count = count + 1;
        }
    }
    // Reset to top of file
    int t = fseek(file, 0, SEEK_SET);
    // Read each line and save it to temp
    int *temp = malloc(sizeof(int)*count);
    int num, i;
    for (i = 0; i<=count; i++){
        fscanf(file, "%dn", &temp[i]);
        printf("%dn", temp[i]);
    }
    fclose(file);
    printf("Hello Worldn");
    return temp;
}

Hello World是向我自己证明,它完全在Fclose崩溃了。该函数从文件中读取INT,该文件仅包含在单独的行(未知数量)上的INT,然后将它们保存到数组,然后返回该数组。谢谢您的帮助,这是我第一次使用C

注意:

C中的索引从0开始。因此,如果要保存count整数,则必须迭代直到count-1

i.e.

  • i < count
  • i <= count-1

您的阅读是错误的,因为您认为您的整数是一个数字。

#include<stdio.h>
#include<stdlib.h>
int * fileRead() {
    FILE *file;
    file = fopen("PATH.txt", "r");
    // Check if the file exists
    if(file == NULL){
        printf("There was a problem opening the file");
        exit(1);
    }
    // Count number of lines in file
    int count = 0;
    char pc = 'n';
    char c;
    while (c = fgetc(file), c != EOF)
    {
        if (c == 'n'  &&  pc != 'n')
            count++;
        pc = c;
    }
      // Reset to top of file
    fseek(file, 0, SEEK_SET);
    // Read each line and save it to temp
    int *temp = malloc(sizeof(int)*count);
    int num, i;
    for (i=0; i<count; i++)
    {
        fscanf (file, "%d", &temp[i]);
    }
    fclose(file);
    return temp;
}

int main()
{
    int *t = fileRead();
    printf("%dn", t[0]);
    printf("%dn", t[1]);
}

文件:

452
55

输出:

542
55

总结:

fclose()崩溃了我的程序。

否。不是fclose,您试图访问内存而不是分配。

您的代码中有多个问题:

  • fgetc(fp)返回一个int值,该值可以具有unsigned char类型和特殊值EOF的所有值。您必须将其存储到类型int的变量中,以使文件测试的末尾可靠。

  • 在循环for (i = 0; i<=count; i++){中,您会导致缓冲区溢出,因为允许进入分配的块的最大索引为count-1。这绝对是导致不确定的行为,并且可以解释观察到的行为。

    而是使用此:

      for (i = 0; i < count; i++) ...
    
  • 您必须将分配的数组的长度传递给呼叫者。

  • 计算行数不能准确确定文件中的条目数。最好两次解析文件或仅一次解析文件,然后动态地重新分配数组。后一种方法对于不可寻找的输入流(例如终端和管道)是必需的。

这是您的代码的修改版本:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int *fileRead(int *countp) {
    // Check if the file exists
    FILE *file = fopen("PATH.txt", "r");
    if (file == NULL) {
        fprintf(stderr, "Cannot open input file PATH.txt: %sn",
                strerror(errno));
        exit(1);
    }
    // Count number of lines in file
    int num, count = 0;
    while (fscanf(file, "%d", &num) == 1) {
        count++;
    }
    // Reset to top of file
    fseek(file, 0, SEEK_SET);
    // Read each line and save it to temp
    int *temp = calloc(sizeof(int), count);
    if (temp != NULL) {
        int i;    
        for (i = 0; i < count; i++) {
            if (fscanf(file, "%d", &temp[i]) != 1) {
                fprintf(stderr, "error reading element number %dn", i);
                break;
            }
        }
        *countp = i;  // number of entries successfully converted
    }
    fclose(file);
    return temp;
}
int main(void) {
    int count;
    int *t = fileRead(&count);
    if (t != NULL) {
        for (int i = 0; i < count; i++) {
            printf("%dn", t[i]);
        }
        free(t);
    }
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新