【问题标题】:Is fprintf not like printf when writing to file?写入文件时 fprintf 不像 printf 吗?
【发布时间】:2015-03-27 19:13:27
【问题描述】:

我已经查看了文档:

上面写着here:

文件成功打开后,您可以使用 fscanf() 读取文件或使用 fprintf() 写入文件。这些功能只是工作 像 scanf() 和 printf(),除了它们需要额外的第一个 参数,要读/写的文件的 FILE *。

因此,我这样编写代码,并确保包含一个条件语句以确保文件打开:

# include<stdio.h>
# include<stdlib.h>

void from_user(int*b){

    b = malloc(10);
    printf("please give me an integer");
    scanf("%d",&b);

}

void main(){

    FILE *fp;

    int*ch = NULL;
    from_user(ch);
    fp = fopen("bfile.txt","w");

    if (fp == NULL){
        printf("the file did not open");
    }
    else {
        printf("this is what you entered %d",*ch);
        fprintf(fp,"%d",*ch);  
        fclose(fp);
        free(ch);   
    }
}

我错了还是文档没有正确解释这一点?谢谢。

【问题讨论】:

  • 我不明白你期望发生什么,除了引用的段落说什么?
  • 您在 scanf 内部使用 from_user&amp; 不应该存在)和一般的内存管理(指针值不会返回到 main)是“错误的”。这与printffprintf 无关。
  • 您可能希望在打印时在文件中添加换行符。您是否尝试在文本编辑器中打开文件?
  • void main() 应该是 int main(void)。如果一本书、教程或讲师告诉您使用void main()找一个更好的。为 int* 分配 10 个字节是没有意义的。你想要 one int 对象,所以 malloc(sizeof (int)) 会更有意义 - 但 malloc 根本不需要,因为你已经有一个 int 对象,其地址被传递作为参数。除了你没有,因为你将ch初始化为NULL。试试:int ch; from_user(&amp;ch);.
  • 您的 from_user 函数不会修改 ch -- 它不能,函数不能修改它们的参数(修改参数只会更新参数的本地副本)。跨度>

标签: c++ c linux file-io printf


【解决方案1】:

from_user() 未正确实现。

  1. 您在from_user() 中创建的指针不会被传递回调用函数。为此,您需要一个双指针,或者通过引用传递。

  2. 在您的代码中,您将int ** 传递给scanf(),而它需要int * 的变量。

这是一个有效的实现:

void from_user(int **b){
    *b = malloc(sizeof(int));
    printf("please give me an integer");
    scanf("%d", *b);
}

int main() {
    int *ch;
    from_user(&ch);
}

你的文件 IO

那部分一切都很好。只是ch 的值被破坏了。

【讨论】:

  • 单指针也够了吧?无论如何,我们在 OP 的 scanf() 有问题的函数中分配和初始化了位置
  • @Gopi:如果我们要编辑ch的值,那么我们需要将指针传递给ch,或者通过引用传递。
  • 我的意思是为什么不在 func() 中执行所有操作并返回指针,如 int *from_user()
  • @Gopi:没问题,pm100 的变体也一样。我觉得这符合原始代码的工作方式。
【解决方案2】:

一个更简单的 from_user 实现

int from_user(){
    int i;
    printf("please give me an integer");
    scanf("%d", &i);
    return i;
}

主要是

int ch = from_user();
...
      printf("this is what you entered %d",ch);
        fprintf(fp,"%d",ch);  

【讨论】:

  • 只需添加应该如何使用:int ch = from_user(); 和以后的fprintf(fp,"%d",ch);
【解决方案3】:

对您自己的代码进行最简单的修复,您不需要使用双指针,只需在 main 中分配内存并将指针传递给您的函数,如下所示:

  1. 删除b = malloc(10);
  2. 删除scanf中b前的&amp;
  3. int*ch = NULL; 更改为int *ch = malloc(sizeof(int));

完成。为什么我们在哪里分配内存很重要?在这里查看我更详细的答案:pointer of a pointer in linked list append

哦,你应该把 free(ch) 从 else 语句中移出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多