Моя программа всегда перестает работать: S (C ++) - PullRequest
1 голос
/ 19 сентября 2011

Я сделал программу для получения данных из файла, она работает, но затем программа говорит, что она перестала работать. Вот мой код:

#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
string show()
{
    FILE *in;
    char c;
    in = fopen("version.txt", "r");
    if(in != NULL)
    {
        while((c = fgetc(in)) != EOF) 
        {
            putchar(c); 
        }
        fclose(in);
    }
    else printf("Unable to open file\n");
}


int main()
{
    show();
}

Ответы [ 5 ]

4 голосов
/ 19 сентября 2011

Ваша функция объявлена ​​для возврата string, но нет оператора возврата.Это "неопределенное поведение" в C ++ (только в main вы можете опустить оператор return, и в этом случае C ++ автоматически примет return 0; - но IMO лучше также всегда его писать).

1 голос
/ 19 сентября 2011

fgetc man говорит:

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int

Когда ваш цикл достигает конца файла, fgetc возвращает EOF, который находится в int.Когда вы приводите его к символу, ваше состояние всегда будет возвращаться как истинное.Вы должны изменить тип c на int перед тестированием, если его значение EOF.

0 голосов
/ 19 сентября 2011

Здесь много неправильных или нечетких вещей.

Во-первых: решите, должен ли это быть C или C ++. В C ++ есть другие методы для чтения файлов (см. std::fstream)

Второе: удалить ненужные заголовки. Включая как stdio, так и iostream (которые делают схожие вещи, одна для C, другая для C ++, означает, что у вас нет четкого представления о том, что вы на самом деле хотите делать!)

В-третьих: включение windows.h означает компиляцию всех объявлений Windows API. То, что вы не используете вообще! Какова была цель этого?

Четвертый: какова цель string в show? string - это тип C ++, в программе, где весь ввод был написан на C. И вы ничего не возвращали!

Пятое: fgetc вернуть как int. Скорее всего, вы столкнетесь с EOF pitflall .

0 голосов
/ 19 сентября 2011

Просто измените string show() на void show().Это решит вашу проблему.

0 голосов
/ 19 сентября 2011

Вы должны вернуть некоторую строку, например return "";

С уважением.

...