首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言檔案寫入無輸出:while 條件判斷寫錯導致迴圈不執行

     編輯:程式設計疑難解答

程式碼意圖讀取鍵盤輸入寫入 ed.txt,但檔案始終為空。關鍵錯誤在第 27 行:

while(ch = !EOF)  // 錯誤:賦值運算,ch 被設為 0 (假),迴圈不進入
// 應為
while(ch != EOF)  // 比較運算,ch 不等於 EOF 才繼續

完整修正版

#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0

typedef char SElemType;
typedef int Status;

typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;

Status InitStack(SqStack &S) { ... } // 略
Status Push(SqStack &S, SElemType e) { ... }
Status Pop(SqStack &S, SElemType &e) { ... }
void StackTraverse(SqStack S, void(*visit)(SElemType)) { ... }

FILE *fp;
void copy(SElemType c) { fputc(c, fp); }

void LineEdit() {
    SqStack s;
    char ch;
    InitStack(s);
    printf("請輸入,Ctrl+Z 結束:\n");
    ch = getchar();
    while (ch != EOF) { // 修正處
        while (ch != EOF && ch != '\n') {
            switch (ch) {
                case '#': if (!StackEmpty(s)) Pop(s, ch); break;
                case '@': ClearStack(s); break;
                default: Push(s, ch);
            }
            ch = getchar();
        }
        StackTraverse(s, copy);
        fputc('\n', fp);
        ClearStack(s);
        if (ch != EOF) ch = getchar();
    }
    DestroyStack(s);
}

int main() {
    fp = fopen("ed.txt", "w");
    if (fp) {
        LineEdit();
        fclose(fp);
    } else {
        printf("建立檔案失敗!\n");
    }
    return 0;
}

補充提醒

  • Windows 控制台 EOF 為 Ctrl+Z,Linux/Mac 為 Ctrl+D。
  • gets 已棄用且不安全,建議用 fgets。
  • 堆疊結構體建議用指標傳遞 (SqStack*) 避免複製大結構體。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved