Xcode和终端中的MacBook EOF问题

Problem with MacBook EOF in Xcode and Terminal

提问人:N1MA 提问时间:10/23/2023 更新时间:10/23/2023 访问量:35

问:

好的,我目前正在学习 c,我的问题是我的老师希望我们使用他发给我们的代码,它可以在 Windows 上运行,但在 Mac 上不起作用,他似乎找不到问题,我使用的是带有 M1 芯片的 MacBook,Mac 上的问题是当我在 editFileContents 中输入后使用 Crtl + D 发出 EOF 信号时,它会编辑文件,但它会继续循环这在编译器中一遍又一遍地出现:

Menu:
1. Display file
2. Edit file
3. Create new file
4. Exit
Choice: Enter the new text (end with Ctrl+D in Unix or Ctrl+Z in Windows):

法典:

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

#define MAX_FILENAME_LENGTH 256
#define MAX_TEXT_LENGTH 1024

void deleteFile(char *filename){
    if (remove(filename) == 0) {
        printf("File %s deleted:\n", filename);
    } else {
        perror("Could not delete the file");
    }
}

void displayFileContents(char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("Could not open the file '%s'\n", filename);
        return;
    }

    char line[MAX_TEXT_LENGTH];
    while (fgets(line, sizeof(line), file) != NULL) {
        printf("%s", line);
    }

    fclose(file);
}

void editFileContents(char *filename) {
    FILE *file = fopen(filename, "a+");
    if (file == NULL) {
        printf("Could not open the file '%s'\n", filename);
        return;
    }

    char newContents[MAX_TEXT_LENGTH];
    printf("Enter the new text (end with Ctrl+D in Unix or Ctrl+Z in Windows):\n");

    while (fgets(newContents, sizeof(newContents), stdin) != NULL) {
        size_t len = strlen(newContents);
        if (len > 0 && newContents[len - 1] == '\n') {
            newContents[len - 1] = '\0';
        }
        fprintf(file, "%s\n", newContents);
    }

    fclose(file);
}

int createNewFile(char *filename) {
    FILE *file = fopen(filename, "r");
    if (file != NULL) {
        printf("File already exists\n");
        fclose(file);
        return 0; // out of createFile
     }
    else {
        FILE *file = fopen(filename, "w");
        if (file == NULL) {
            printf("Could not create the file '%s'\n", filename);
            return 1; // out of createFile
        }
        fclose(file);
    }
    editFileContents(filename);
    return 2;
}

int main() {
    char filename[MAX_FILENAME_LENGTH];
    printf("Enter the filename to work on\n");
    scanf("%s", filename);

    int choice;

    while (1){
        printf("\nMenu:\n");
        printf("1. Display file\n");
        printf("2. Edit file\n");
        printf("3. Create new file\n");
        printf("4. Exit\n");
        printf("Choice: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                displayFileContents(filename);
                break;
            case 2:
                editFileContents(filename);
                break;
            case 3:
                createNewFile(filename);
                break;
            case 4:
                printf("Exiting...\n");
                return 0;  // out of main()
            default:
                printf("Invalid choice. Try again.\n");
        }
    }
}

所以几天来一直被这个问题困住了,我尝试了所有我能想到的包括 chatGPT

我确实确保我正在编辑正确的文件

我确实尽力解决问题,但似乎找不到它。

我尝试从 Xcode 更改为终端,但没有改变任何东西。

C Xcode macOS 终端 EOF

评论

0赞 Ture Pålsson 10/23/2023
我认为您正在尝试阅读过去的文件末尾,使这个问题与这个问题重复。
1赞 Eric Postpischil 10/23/2023
Yoy 未初始化,并且您未测试 的返回值。choicescanf
0赞 pmg 10/23/2023
scanf("%d", &choice);与 相同。注意 ?还记得您在编辑文本时输入了 <kbd>Ctrl+D</kbd>...进入“文件结束”状态。嗯......闻起来有鱼腥味......也许在解冻之后会有所帮助???fscanf(stdin, "%d", &choice);stdinstdinclearerr(stdin);EOF

答:

1赞 Eric Postpischil 10/23/2023 #1

程序仅在 4 时退出循环。但是,当程序收到文件结束指示时,程序中的任何内容都不会设置为 4。whilechoicechoice

如果在完成输入项的任何转换之前遇到文件结束指示,则返回宏的值,并且不会更改存储在 中的值。要检测到这一点,必须测试 的返回值。如果它不是 1,则表示输入项的一次转换已完成,则未在 中存储值。scanfscanf("%d", &choice)EOFchoicescanfscanf("%d", choice)choice