我在写入文件时遇到问题,这是代码:
#include <stdio.h>
int main(int argc,char* argv[])
{
if(argc!=2)
{
printf("\x1B[31mError::%s takes exactly one argument!\n\x1B[0m",argv[0]);
return 1;
}
char string[100];
FILE* file=fopen(argv[1],"w");
if(file==NULL)
{
printf("\x1B[31mFile is invalid!\x1B[0m\n");
return 1;
}
while(!feof(stdin))
{
scanf("%s",string);
fprintf(file,"%s\n",string);
}
fclose(file);
return 0;
}
它应该使用scanf输入并写入文件,直到我输入文件结束字符(ctrl + Z),当它完成运行时,我打开的文件为空。这个代码结构也在deitel&amp; amp; deitel book,你知道这里有什么问题吗? 另外,我想知道我怎样才能用scanf而不是单个单词来表达整个短语..如果我做scanf(&#34;%[^ \ n]&#34;,string) 程序变得困惑,一旦我写了一些东西,它就会循环写出同样的东西一遍又一遍,文件将变得像1,7Gb大..帮助!
答案 0 :(得分:0)
当用户按ctrl+z
时,您的流程(a.out
)将在内部收到signal
否20
,您的流程将为stopped
,但数据将not
1}}因为程序被终止abnormally
而被保存。
您可以在man 7 signal
上输入terminal
并查看default actio
的{{1}} n。那么现在你需要修改ctrl+z
默认操作吗?怎么样 ?使用ctrl+z
或signal()
。
每当按下sigaction()
时,使用ctrl+z
系统调用跳转到isr()
并save
当前进程状态。 exit()
的信号为ctrl+z
。
我在您的代码中做了一些小修改。
20
一旦浏览#include <unistd.h>
#include <stdio.h>
#include <signal.h>
void isr(int n)
{
if(n == 20)//if ctrl+z is pressed then condition will be true
{
printf("in isr :\n");
exit(0);//exit(0) is normal termination of process i.e it will save current process context
}
}
int main(int argc,char* argv[])
{
if(argc!=2)
{
printf("\x1B[31mError::%s takes exactly one argument!\n\x1B[0m",argv[0]);
return 1;
}
char string[100];
FILE* file=fopen(argv[1],"w");
if(file==NULL)
{
printf("\x1B[31mFile is invalid!\x1B[0m\n");
return 1;
}
while(!feof(stdin))
{
signal(20,isr);//when user presses ctrl+z it will jump to isr()
scanf("%s",string);
fprintf(file,"%s\n",string);
}
fclose(file);
return 0;
}
和signal()
的手册页。