簡體   English   中英

當我嘗試使用 .txt 文件時,.exe 程序崩潰

[英].exe program crashes when I try to work with a .txt file

我正在嘗試讀取 .txt 文件。 任務是讀取溫度並給出最小值、最大值和平均值。 txt 文件稱為 Temp.txt,它看起來像這樣:

5 76 56 34 35 10
4 45 23 24 14
0
2 32 34 

這是我編寫的代碼。 我也嘗試使用像'fopen(“Temp.txt”,“r”)'這樣的文件名來運行它,但我得到了相同的結果。

#include<stdio.h>
#include<string.h>

int ReadTempFile(FILE *fp, float temperatur[]);
float maxTemp(int anzahl, float temperatur[]);
float minTemp(int anzahl, float temperatur[]);
float mittlereTemp(int anzahl, float temperatur[]);
float fahrenheit(float celsius);

int ReadTempFile(FILE *fp, float temperatur[])    //For reading individual rows from txt file
{
    int i=0;
    fscanf(fp,"%f", &temperatur[0]);
    for(i = 0; i < temperatur[0]; ++i)
    {
        fscanf(fp, "%f", &temperatur[i+1]);
    }
    return temperatur[0];
}

float maxTemp(int anzahl, float temperatur[])    //Maximum Temperature
{
    int i = 0;
    float max;
    max = temperatur[i+1];
    for(i = 1; i < anzahl; i++)
    {
        if(temperatur[i+1] > max)
        {
            max = temperatur[i+1];
        }
    }
    return max;
}

float minTemp(int anzahl, float temperatur[])    //Minimum Temperature
{
    int i = 0;
    float min;
    min = temperatur[i+1];
    for(i = 1; i < anzahl; i++)
    {
        if(temperatur[i+1] < min)
        {
            min = temperatur[i+1];
        }
    }
    return min;
}

float mittlereTemp(int anzahl, float temperatur[])    //Average Temperature
{
    int i, sum = 0;
    float mit;
    for (i = 0; i <= anzahl; i++)
    {
        sum += temperatur[i];
    }
    mit = sum/temperatur[0];
    return mit;
}

float fahrenheit(float celsius)    //Celsius to Fahrenheit
{
    float f;
    f = (celsius*9/5) + 32;
    return f;
}


int main()
{
    int end, n, Zeile=1;
    float temperatur[20], max, min, mit, fmax, fmin, fmit;
    char eingabe[20];
    FILE *fp=NULL;
    do
    {
        printf("Enter File name: \n");    //Enter file name
        fflush(stdout);
        scanf("%s", eingabe);
        fp = fopen(eingabe, "r" );
        if(fp == NULL) printf ("Error: File %s can't be opened!\n", eingabe);    //Error message for File cant be opened
    }while(fp != NULL);

    do{
        n = ReadTempFile(fp, temperatur);

        max = maxTemp(n, temperatur);
        printf("Das Maximum der Zeile %d ist: %.3fC \t",Zeile, max);

        fmax = fahrenheit(max);
        printf("In Fahrenheit: %.3fF\n", fmax);

        min = minTemp(n, temperatur);
        printf("Das Minimum der Zeile %d ist: %.3fC \t",Zeile, min);

        fmin = fahrenheit(min);
        printf("In Fahrenheit: %.3fF\n", fmin);

        mit = mittlereTemp(n, temperatur);
        printf("Der Mittelwert der Zeile %d ist: %.3fC \t",Zeile, mit);

        fmit = fahrenheit(mit);
        printf("In Fahrenheit: %.3fF\n", fmit);

        ++Zeile;

        end = feof(fp);
        printf("\n\n");
    }while (end == 0);

    fclose(fp);
    return 0;
}

這是我運行上述程序后發生的情況。

先感謝您。

可能導致崩潰的最直接問題是打開文件的邏輯:

do
{
    printf("Enter File name: \n");    //Enter file name
    fflush(stdout);
    scanf("%s", eingabe);
    fp = fopen(eingabe, "r" );
    if(fp == NULL) printf ("Error: File %s can't be opened!\n", eingabe);
}while(fp != NULL);   // <- Loops until it fails

這將保證在文件無法打開之前循環不會結束。 當您稍后嘗試將fscanffp設置為NULL時,您將有未定義的行為(這可能表現為崩潰)。

建議修復:

for(;;) {
    puts("Enter File name:");
    if(scanf("%19s", eingabe) == 1) { // make sure scanf succeeds
        fp = fopen(eingabe, "r" );
        if(fp) break;                 // break out when it succeeds to open
        perror(eingabe);
    } else {
        fprintf(stderr, "Error: No filename entered.\n");
        return 1;
    }
}

注意:在您的示例運行中,您表明您輸入了Temp以打開Temp.txt 您必須輸入Temp.txt才能成功打開Temp.txt


這是您的程序以及其他一些修復程序。 我已經評論了內聯,所以你明白我為什么建議改變。

筆記:

  • 我已經完全消除了temperatur中的+1偏移。 您不應該使用第一個float來存儲整數值的溫度計數。
  • 你的mittlereTemp沒有使用這個偏移量,所以它也給出了錯誤的答案。
  • mittlereTemp沒有計算中值溫度(我認為“mittlereTemp”的意思)。 它試圖計算平均溫度,因此我將名稱更改為durchschnittsTemp
#include <math.h>
#include <stdio.h>
#include <string.h>

// For reading individual rows from txt file
// max_anzahl added to not try to read too many
int ReadTempFile(FILE* fp, float temperatur[], int max_anzahl) {
    int count;
    // return -1 on failure
    if(fscanf(fp, "%d", &count) != 1) return -1;

    // we can't read all the entries if count > max_anzahl
    if(count > max_anzahl || count < 0) return -1;

    for(int i = 0; i < count; ++i) {
        if(fscanf(fp, "%f", &temperatur[i]) != 1) {
            return -1; // could not read count floats, failure
        }
    }

    return count;
}

// The idiomatic way is to have the array pointer first and
// the count second so I swapped the order of temperatur and anzahl:
float maxTemp(float temperatur[], int anzahl) {
    if(anzahl == 0) return NAN; // if we have no values, we have no max temp

    float max = temperatur[0];

    for(int i = 1; i < anzahl; i++) {
        if(temperatur[i] > max) {
            max = temperatur[i];
        }
    }
    return max;
}

float minTemp(float temperatur[], int anzahl) {
    if(anzahl == 0) return NAN; // if we have no values, we have no min temp

    float min = temperatur[0];

    for(int i = 1; i < anzahl; i++) {
        if(temperatur[i] < min) {
            min = temperatur[i];
        }
    }
    return min;
}

// I changed the name to durchschnittsTemp
float durchschnittsTemp(float temperatur[], int anzahl) {
    if(anzahl == 0) return NAN; // if we have no values, we have no average temp

    float sum = 0.f;            // use the proper type for sum

    for(int i = 0; i < anzahl; i++) {
        sum += temperatur[i];
    }
    return sum / (float)anzahl;
}

float fahrenheit(float celsius) {
    float f;
    f = (celsius * 9 / 5) + 32;
    return f;
}

// since opening the file is a lot of code, make a function
FILE* open_file_supplied_by_the_user() {
    char eingabe[FILENAME_MAX]; // make plenty of room for the filename
    for(;;) {
        puts("Enter File name:");
        // use fgets instead of scanf to make it easier to read filenames with spaces
        if(fgets(eingabe, sizeof eingabe, stdin)) {
            size_t len = strlen(eingabe);
            eingabe[len - 1] = '\0';
            FILE* fp = fopen(eingabe, "r");
            if(fp) return fp; // break out when it succeeds to open
            perror(eingabe);  // give the user a proper error message
        } else {
            fprintf(stderr, "Error: No filename entered.\n");
            return NULL;
        }
    }
}

#define Size(x) (sizeof(x) / sizeof *(x))

int main() {
    FILE* fp = open_file_supplied_by_the_user();
    if(fp == NULL) return 1; // exit if no file was opened

    float temperatur[20];

    // loop until ReadTempFile() returns -1 (failure)
    for(int n, Zeile = 1;
        (n = ReadTempFile(fp, temperatur, Size(temperatur))) != -1;
        ++Zeile)
    {
        float max = maxTemp(temperatur, n);
        printf("Das Maximum der Zeile %d ist: %.3fC \t", Zeile, max);
        printf("In Fahrenheit: %.3fF\n", fahrenheit(max));

        float min = minTemp(temperatur, n);
        printf("Das Minimum der Zeile %d ist: %.3fC \t", Zeile, min);
        printf("In Fahrenheit: %.3fF\n", fahrenheit(min));

        float mit = durchschnittsTemp(temperatur, n);
        printf("Der Durchschnittswert der Zeile %d ist: %.3fC \t", Zeile, mit);
        printf("In Fahrenheit: %.3fF\n", fahrenheit(mit));

        printf("\n\n");
    }

    fclose(fp);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM