字符数组在文件处理中不起作用

时间:2014-03-15 09:09:53

标签: c arrays file-io

我想要做的是,创建一个程序,要求用户输入他想要写多长文本。之后,他在控制台中写入的内容会自动保存在代码中提到的以下路径中名为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;

}

2 个答案:

答案 0 :(得分: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')被重定向到具有DOS行尾(stdin而不是\r\n的文件,则\n可以使代码正常工作}),在这种情况下必须消耗2个字符。即使你打算只从终端使用它(没有stdin redirecton),我仍然建议保持这种方式 - 按ENTER键也可以将\r\n推送到stdin

答案 1 :(得分:0)

我会改变

FILE *file = fopen("C://Users//Abhimanyu Aryan//Desktop//Data//Hello.txt", "w");

FILE *file = fopen("C:/Users/Abhimanyu Aryan/Desktop/Data/Hello.txt", "w");

FILE *file = fopen("C:\\Users\\Abhimanyu Aryan\\Desktop\\Data\\Hello.txt", "w");

我不知道有两个正斜杠作为目录分隔符会导致任何问题,但肯定没有必要。