首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符数组在文件处理中不工作

字符数组在文件处理中不工作
EN

Stack Overflow用户
提问于 2014-03-15 09:09:52
回答 2查看 80关注 0票数 0

我想做的是,创建一个程序,要求用户输入他想要写多长时间的文本。与他在控制台中所写的内容相比,在代码中提到的路径下,将自动保存在名为file的文本文件中。因此,为了询问用户我使用int i的字符数组的大小。然后使用gets命令来获取他用空格和其他字符编写的任何内容。但是代码似乎不起作用,它询问用户有多少个字符,然后运行完成和终止。还要告诉我,每当用户启动程序时,应该如何使它在Data文件夹中创建一个新文件?我不想覆盖现有的文件或附加文本到它。我想要创建一个新的文件,让用户命名它的任何感觉,然后存储在新的文件中的文本。

代码语言:javascript
复制
#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;

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-15 09:20:35

您的代码有几个错误。首先,您应该检查fopen()的返回值,以确保一切都成功:

代码语言:javascript
复制
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()代替:

代码语言:javascript
复制
char text[c];

fgets(text, sizeof text, stdin);

如果您希望用户选择文件名,那么首先询问他,然后打开指定的文件名进行写入。如果文件不存在,它将自动创建:

代码语言:javascript
复制
#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()这样做:

代码语言:javascript
复制
/* ... */
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行尾文件(\r\n而不仅仅是\n)的情况下工作,在这种情况下,必须使用2个字符。即使您计划只从终端使用这个(没有stdin重定向),我仍然建议这样做--按ENTER键也可以将\r\n推向stdin

票数 0
EN

Stack Overflow用户

发布于 2014-03-15 19:11:26

我会改变

代码语言:javascript
复制
FILE *file = fopen("C://Users//Abhimanyu Aryan//Desktop//Data//Hello.txt", "w");

代码语言:javascript
复制
FILE *file = fopen("C:/Users/Abhimanyu Aryan/Desktop/Data/Hello.txt", "w");

代码语言:javascript
复制
FILE *file = fopen("C:\\Users\\Abhimanyu Aryan\\Desktop\\Data\\Hello.txt", "w");

我不知道使用两个正斜杠作为目录分隔符是否会导致任何问题,但这当然是不必要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22421799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档