程序在更改字符时退出?

时间:2015-04-08 11:48:56

标签: c file fopen eof fclose

我正在尝试制作一个程序,将(Đ,Š,Č,Ć和Ž)塞尔维亚语(拉丁语)字符转换为(D,S,C,C,Z),这样我的电视就可以通过它来识别它们。
不,这不是编码错误,是的,我的电视正在运行最新的软件。
所以我决定制作一个转换字符的命令程序 问题是目标文件保持不变,并在此消息后退出:

Počinje konvertovanje.

为什么会这样? 来源:

#include <stdio.h>
#include <stdlib.h>
char c;
char filename[256];
int er;
int main()
{
    printf("\nUnesi podatak za prevoðenje:");
    scanf("%s",&filename);
    FILE* filepointer;
    filepointer = fopen(filename,"r+");
    if(filepointer == NULL){
        fclose(filepointer);
        printf("\nGREŠKA: Nije moguæe otvoriti podatak!");
    }else{
        printf("\nUspješno otvoren podatak.");
        printf("\nPoèinje konvertovanje.");
        proccess:
        if(c = fgetc(filepointer) != EOF){
            if(c == 0x9A){  // ZA Š
                c = 0x73;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }else if(c == 0xF0){ //ZA Đ
                c = 0x64;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }else if(c == 0x9E){
                c = 0x7A;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }else if(c == 0xE8){
                c = 0x63;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }else if(c == 0xE6){
                c = 0x63;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }
            goto proccess;
        }
        if((c = fgetc(filepointer) ) != EOF){
            printf("Prijavljen EOF: Podatak se završava!");
            exit(0);
        }
    }
    return 0;
    error:
        printf("\nPrijavljen neoèekivani EOF,");
        printf("\nvjerovatno je neka greška!");
        return 1;
}

平台: Windows 7家庭高级版(x64)
编译: Tiny C编译器(x64)

2 个答案:

答案 0 :(得分:1)

您被操作员优先级咬伤了:

if(c = fgetc(filepointer) != EOF)

应该是:

if((c = fgetc(filepointer)) != EOF)

请注意,如果您编译时启用了警告(例如gcc -Wall ...),编译器会帮助指出这个错误:

main.c:19:41: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
         if(c = fgetc(filepointer) != EOF){

你也会被警告另一个错误:

main.c:23:28: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
                 if(er = EOF)

这一行当然应该是:

                 if(er == EOF)

<小时/> 另一个问题 - 您正在尝试修改输入文件&#34;到位&#34; - 这通常是一个坏主意(任何错误通常意味着你留下了一个损坏的原始文件)。此外,代码当前编写的方式不会做你想要的(正如你所看到的)。更好的方法是将输出写入新文件,然后成功完成后,您可以删除旧文件并重命名新文件。
作为奖励,有关编程风格的一些指示:

  • 避免全局
  • 请勿使用goto

答案 1 :(得分:0)

两件事。

第1点。根据C operator precedence,在您的代码中

if(c = fgetc(filepointer) != EOF)` 

转换为

if ( c =  (fgetc(filepointer) != EOF) )`

这不是你想要的。您应该将其更改为

if((c = fgetc(filepointer)) != EOF)`

第2点。

 if(er = EOF)

=是分配运营商。要比较值,您需要使用eqality运算符==。你的代码应该是

if(er == EOF)

注意:如果可能,请避免goto。这不是一个很好的编程风格。尝试编写一个函数并调用它。