提问人:N1MA 提问时间:10/23/2023 更新时间:10/23/2023 访问量:35
Xcode和终端中的MacBook EOF问题
Problem with MacBook EOF in Xcode and Terminal
问:
好的,我目前正在学习 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 更改为终端,但没有改变任何东西。
答:
1赞
Eric Postpischil
10/23/2023
#1
程序仅在 4 时退出循环。但是,当程序收到文件结束指示时,程序中的任何内容都不会设置为 4。while
choice
choice
如果在完成输入项的任何转换之前遇到文件结束指示,则返回宏的值,并且不会更改存储在 中的值。要检测到这一点,必须测试 的返回值。如果它不是 1,则表示输入项的一次转换已完成,则未在 中存储值。scanf
scanf("%d", &choice)
EOF
choice
scanf
scanf("%d", choice)
choice
评论
choice
scanf
scanf("%d", &choice);
与 相同。注意 ?还记得您在编辑文本时输入了 <kbd>Ctrl+D</kbd>...进入“文件结束”状态。嗯......闻起来有鱼腥味......也许在解冻之后会有所帮助???fscanf(stdin, "%d", &choice);
stdin
stdin
clearerr(stdin);
EOF