我想做的是,创建一个程序,要求用户输入他想写多长的文本。之后,他在控制台中编写的任何内容都会自动保存在代码中提到的路径中名为 file
的文本文件中。因此,为了询问用户字符数组的大小,我使用了int i
。然后使用gets
命令来获取他写的任何内容,因为它包含空格和其他字符。但代码似乎不起作用,它询问用户有多少个字符,然后运行完成并终止。还告诉我应该做什么才能让它在每次用户启动程序时在 Data
文件夹中创建一个新文件?我不想覆盖现有文件或向其中添加文本。我想创建一个新文件,让用户随意命名,然后将该文本存储在该新文件中。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *file = fopen("C://Users//Abhimanyu Aryan//Desktop//Data//Hello.txt", "w");
printf("\t\tThis program allows you to write detailed data\n\n\n");
int c;
printf("you many characters file you want to write? Specify: ");
scanf("%i",&c);
printf("\n\nEnter your text here: ");
char text[c];
gets(text);
fprintf(file, "%s" , text);
printf(" the file has been written succesfully!!!!");
fclose(file);
return 0;
}
最佳答案
您的代码有一些问题。首先,您应该检查 fopen()
的返回值以确保一切成功:
FILE *file = fopen("C://Users//Abhimanyu Aryan//Desktop//Data//Hello.txt", "w");
if (file == NULL) {
/* Handle fopen() error */
fprintf(stderr, "Couldn't open file for writing!");
exit(EXIT_FAILURE);
}
第二个错误是您使用了gets()
。 gets()
已经过时、已弃用且不安全,您永远不应该使用它。使用 fgets()
代替:
char text[c];
fgets(text, sizeof text, stdin);
如果你想让用户选择文件名,首先要询问他,然后打开指定的文件名进行写入。如果文件不存在,则会自动创建:
#define MAX_FILENAME_LENGTH 128
char filename[MAX_FILENAME_LENGTH];
printf("Enter filename (max. %zu characters): ", sizeof(filename)-1);
fgets(filename, sizeof filename, stdin);
FILE *file = fopen(filename, "w");
if (file == NULL) {
/* Handle fopen() error as mentioned above*/
}
更新:
请注意,scanf("%i", &c);
将在缓冲区中留下换行符(从按 ENTER 键时开始)。这就是为什么 fgets()
不等待就过早返回的原因:它从先前的输入中读取缓冲区中留下的换行符,并假设您已完成(fgets
当它遇到新队)。要修复此问题,您必须在调用 scanf()
之前使用缓冲的换行符。您可以使用 getchar()
来执行此操作,例如:
/* ... */
scanf("%i",&c);
/* Consume newline left on buffer from scanf */
if (getchar() == '\r')
(void) getchar();
printf("\n\nEnter your text here: ");
/* ... */
if (gethcar() == '\r')
的作用是在 stdin
被重定向到以 DOS 结尾的文件的情况下使代码正常工作-of-lines(\r\n
而不仅仅是 \n
),在这种情况下必须消耗 2 个字符。即使您打算仅从终端使用它(没有 stdin
重定向),我仍然建议保持这种方式 - 按 ENTER 可能会将 \r\n
推送到 stdin
也是如此。
关于c - 字符数组在文件处理中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22421799/