使用 fprintf 写入文件
write into a file with fprintf
我尝试用这个函数写入一个文件。
当我用这一行调用函数时,文件仍然是空的:
if(argc-optind==0){
char* line=readcli();
printf("testline:%s\n",line); //WORKS
line=replacet(line,t,countt(line));
if(oFlag==1){
writeinfile(line,oFileName);
}else{
printf("Expanded:%s\n",line);
}
}
但是如果我这样称呼它就可以了:
char text[]={"test"};
char * textptr=text;
writeinfile(textptr,fp);
void writeinfile(char* line,char* file){
FILE *f = fopen(file, "a");
if (f == NULL){
printf("Error opening file!\n");
exit(1);
}
fprintf(f, "Some text: %s\n",line);
fclose(f);
}
用空格替换制表符
char* replacet (char *text, int tabsize, int tabanz){
int newsize=strlen(text)+tabsize*tabanz-tabanz;
char newtext[newsize];//Wenn \t nu ein zeichen ist
char* ptrnew=newtext;
char* ptr=text;
for(int i=0;i<strlen(text);i++,ptr++){
if(text[i]=='\t'){
for(int j=0;j<tabsize;j++){
*ptrnew=' ';
ptrnew++;
}
}else{
*ptrnew=text[i];
ptrnew++;
}
}
char* newtextptr=newtext;
return newtextptr;
}
读取在命令行界面输入的一行
char* readcli(){
char *buffer;
size_t bufsize = 64;
size_t chars;
buffer = (char *)malloc(bufsize * sizeof(char));
if( buffer == NULL){
perror("Error malloc");
}
printf("Type something with Tabulators: ");
chars = getline(&buffer,&bufsize,stdin);
printf("%zu characters were read.\n",chars);
return buffer;
}
请帮助我,我不知道该如何解决。
谢谢
两期:
这里
char* replacet (char *text, int tabsize, int tabanz){
int newsize=strlen(text)+tabsize*tabanz-tabanz;
char newtext[newsize];//Wenn \t nu ein zeichen ist
...
char* newtextptr=newtext;
return newtextptr; /* <-- HERE */
返回局部变量(newtext
)的地址。只有在函数内部,内存才有效。
函数返回的那一刻,内存就自动释放了。在函数返回后访问它会调用臭名昭著的未定义行为。从这一刻起,任何事情都可能发生。不要这样做。
函数 replacet()
未命中 0
-终止新的 C-"string".
要解决所有这些问题,请替换
char newtext[newsize];
由
char * newtext = malloc(newsize + 1); /* +1 for 0-terminator each
c-"string" needs */
if (NULL == newtext) /* Error checking is debugging for free. */
{
return NULL;
}
在离开前添加0
-终止符:
newtext[i] = '[=13=]'; /* or just the equivalent: ... = 0; */
char* newtextptr = newtext;
return newtextptr;
}
更改调用代码
line=replacet(line,t,countt(line));
到
{
char * pctmp = replacet(line, t, countt(line));
if (NULL == pctmp)
{
/* exit or do what error handling made sense */
exit(EXIT_FAILURE); /* include stlib.h for the EXIT_* macros */
}
else
{
free(line);
line = pctmp;
}
}
我尝试用这个函数写入一个文件。 当我用这一行调用函数时,文件仍然是空的:
if(argc-optind==0){
char* line=readcli();
printf("testline:%s\n",line); //WORKS
line=replacet(line,t,countt(line));
if(oFlag==1){
writeinfile(line,oFileName);
}else{
printf("Expanded:%s\n",line);
}
}
但是如果我这样称呼它就可以了:
char text[]={"test"};
char * textptr=text;
writeinfile(textptr,fp);
void writeinfile(char* line,char* file){
FILE *f = fopen(file, "a");
if (f == NULL){
printf("Error opening file!\n");
exit(1);
}
fprintf(f, "Some text: %s\n",line);
fclose(f);
}
用空格替换制表符
char* replacet (char *text, int tabsize, int tabanz){
int newsize=strlen(text)+tabsize*tabanz-tabanz;
char newtext[newsize];//Wenn \t nu ein zeichen ist
char* ptrnew=newtext;
char* ptr=text;
for(int i=0;i<strlen(text);i++,ptr++){
if(text[i]=='\t'){
for(int j=0;j<tabsize;j++){
*ptrnew=' ';
ptrnew++;
}
}else{
*ptrnew=text[i];
ptrnew++;
}
}
char* newtextptr=newtext;
return newtextptr;
}
读取在命令行界面输入的一行
char* readcli(){
char *buffer;
size_t bufsize = 64;
size_t chars;
buffer = (char *)malloc(bufsize * sizeof(char));
if( buffer == NULL){
perror("Error malloc");
}
printf("Type something with Tabulators: ");
chars = getline(&buffer,&bufsize,stdin);
printf("%zu characters were read.\n",chars);
return buffer;
}
请帮助我,我不知道该如何解决。 谢谢
两期:
这里
char* replacet (char *text, int tabsize, int tabanz){ int newsize=strlen(text)+tabsize*tabanz-tabanz; char newtext[newsize];//Wenn \t nu ein zeichen ist ... char* newtextptr=newtext; return newtextptr; /* <-- HERE */
返回局部变量(
newtext
)的地址。只有在函数内部,内存才有效。函数返回的那一刻,内存就自动释放了。在函数返回后访问它会调用臭名昭著的未定义行为。从这一刻起,任何事情都可能发生。不要这样做。
函数
replacet()
未命中0
-终止新的 C-"string".
要解决所有这些问题,请替换
char newtext[newsize];
由
char * newtext = malloc(newsize + 1); /* +1 for 0-terminator each
c-"string" needs */
if (NULL == newtext) /* Error checking is debugging for free. */
{
return NULL;
}
在离开前添加0
-终止符:
newtext[i] = '[=13=]'; /* or just the equivalent: ... = 0; */
char* newtextptr = newtext;
return newtextptr;
}
更改调用代码
line=replacet(line,t,countt(line));
到
{
char * pctmp = replacet(line, t, countt(line));
if (NULL == pctmp)
{
/* exit or do what error handling made sense */
exit(EXIT_FAILURE); /* include stlib.h for the EXIT_* macros */
}
else
{
free(line);
line = pctmp;
}
}