如何在C ++中按顺序在一个文件中写入2个文件指针?

时间:2016-03-11 04:38:37

标签: c++ file

#include <QCoreApplication>
#include <stdio.h>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int x = 2;

    FILE *fp [x];

    fp[0] = fopen ("temp.txt", "w");
    fp[1] = fopen ("temp.txt", "w");

    if (fp[1])
        qDebug () << "Fine";

    fputs ("What is your name?\n", fp[0]);
    fputs ("What is your name?\n", fp[0]);
    fputs ("What is your name?\n", fp[0]);

    fputs ("My name is XYZ.\n", fp[1]);

    fputs ("What is your name?\n", fp[0]);
    fputs ("What is your name?\n", fp[0]);


    fclose (*fp);

    return a.exec();
}

为方便起见,我使用的是Qt。

正在打印“正常”字样 该计划的输出是:

What is your name?
What is your name?
What is your name?
What is your name?
What is your name?

为什么输出中缺少My name is XYZ.?可以做些什么来使这些文件指针在一个文件中顺序写入?

2 个答案:

答案 0 :(得分:2)

借鉴Opening a file using fopen with same flag in C

  

你有两个FILE*对同一个文件开放,指向的开头   该文件,因此其中一个写操作会覆盖另一个。

     

另请注意,FILE *通常是缓冲的,所以这些小字符串   当fclose()或fflush()时,实际上会写入文件   文件*。既然你什么都不做,那么系统就会这样做   应用程序退出,因此写入被覆盖取决于哪个   文件系统首先关闭。

     

如果你在附加模式下打开2个文件,请打开(&#34; mytext&#34;,&#34; a&#34;);,你就是这样   看到不同的结果,但是你需要fflush()FILE *   我希望确保在其他文件上运行*没有原因   交错输出。并从不同的文件写入同一个文件   进程/线程将更加谨慎,例如某种形式的文件锁定。

在您的情况下,您将关闭fp[0],但不关闭fp[1]。两次写入都是独立的,可能"My name is XYZ.\n"首先刷新到文件中(到开头),然后所有字符串"What is your name?\n"从开头覆盖上一行就被刷新到文件中。

  

如何在C ++中按顺序在一个文件中写入2个文件指针?

不要使用fopen重新打开文件并使用相同的文件描述符或使用日志实用程序函数,该函数将静态指针保存到打开的文件,或者每次登录时打开文件并在记录后关闭文件

static void log(char *line)
{
  static FILE *fp = fopen("temp.txt", "w");
  if(fp) fputs ("What is your name?\n", fp);
}

以及后来的main()

log("What is your name\n");

答案 1 :(得分:0)

FILE *fp [x];

fp[0] = fopen ("temp.txt", "w");

fputs ("What is your name?\n", fp[0]);
fputs ("What is your name?\n", fp[0]);
fputs ("What is your name?\n", fp[0]);
fputs ("What is your name?\n", fp[0]);
fputs ("What is your name?\n", fp[0]);
fp[1] = fopen ("temp.txt", "w");
fputs ("My name is XYZ.\n", fp[1]);

试试这样。