【问题标题】:C - program writes only one line with fprintfC - 程序只用 fprintf 写一行
【发布时间】:2017-04-14 21:11:55
【问题描述】:

我正在尝试创建一个使用不同线程写入文件的程序。我写了以下代码。

#include <time.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>


pthread_t thread_id;

void *write_file(void *arg) {
    int number = (int) arg;
    FILE *file_write = fopen("file.txt", "w");
    fprintf(file_write, "Number: %d\n", number);
    fclose(file_write);
    printf("Thread Finalized\n");
    return NULL;
}

int main() {
    chdir("/");
    srand(time(NULL));
    int cont = 0;
    while(1) {
        int random_number = rand();
        if(random_number % 5 == 0) {
            cont++;
            int response = pthread_create(&thread_id, NULL, write_file, (void *) random_number);
            if(response != 0) {
                printf("Can't create process\n");
            } else {
                printf("Thread created successfully\n");
            }
        }
        sleep(1); 
        if(cont == 8) {
            break;
        }
    }
    return 0;
}

但是当我打开文件时,我发现只有一行如下:

Number: 1069822935

我期望文件应该包含 8 行,其中随机数可被 5 整除。

谢谢。

【问题讨论】:

  • 当您以w 模式打开时,它会清空文件。如果要添加到文件中,请使用a 模式。
  • 重要的是要注意,如果要执行该文件,您必须在根 (/) 目录中有一个file.txt
  • 在你解决了fopen 问题之后,你的下一个任务就更高级了。您将需要防止这些线程相互交叉。如果你不这样做,你的文件最终会随机乱码。
  • 感谢@CareyGregory 的建议,目前,我不需要在方法访问文件时处理并发问题。但我会考虑到这个问题,我会尽量控制这种缺乏作为锻炼。

标签: c file printf


【解决方案1】:

您的文件模式不能这样工作。如果每个线程在“w”中打开文件 - 写入 - 每个线程都会覆盖已经存在的任何内容。附加的“a”应该可以工作。

另请参阅:http://www.c4learn.com/c-programming/c-file-open-modes/

【讨论】:

    【解决方案2】:

    使用"w",每次调用fopen 都会截断文件。所以他们每个人都从头开始写作。您应该以附加模式打开文件...然后您将遇到并发问题;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多