繁体   English   中英

fscanf 不读取 C 中的文件内容(使用 pthreads)

[英]fscanf not reading file contents ( using pthreads ) in C

我在使用 pthreads 和读取文件时遇到问题。 我们的教授主要只教理论,我一直在努力学习。 正如标题所说,我在使用 fscanf 读取文件时遇到问题。 我的主要功能如下。

#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#define MAX 15000

void createandFillFile(char*);
void* determineMin(void*);



int main(int argc, char* argv[])
{
    //determins if argc is less than 2
    if(argc < 2)
    {
        printf("format is:./a.out <filename> \n");
        return -1;
    }

    createandFillFile(argv[1]);

    pthread_attr_t attr;
    pthread_t minThread; //maxThread, avgThread;

    //series of if statements to determine if the pthread functions have been executed correctly
    if(pthread_attr_init(&attr) != 0)
    {
        printf("ERROR: THREAD INITIATION FAILURE");
        return -1;
    }

    if(pthread_create(&minThread,&attr,determineMin,(void*)argv) != 0)
    {
        printf("ERROR: THREAD CREATION FAILURE");
        return -1;
    }

    if(pthread_join(minThread,NULL) != 0)
    {
        printf("ERROR: THREAD JOIN FAILURE");
        return -1;
    }

    return 0;
}

我创建文件然后用 -200 到 200 范围内的 15000 个数字填充它的函数如下。

{
    //creates the file pointer
    FILE *fileptr;

    //creates the file
    fileptr = fopen(fileName,"w");


    int lower = -200;
    int upper = 200;

    int number;

    srand(time(NULL));

    for(int i=0; i<MAX; i++)
    {
        number = (rand() % (upper-lower+1))+lower;
        fprintf(fileptr,"%i ",number);

    }

    fclose(fileptr);
}

使用 pthread minThread 的最后一个函数如下。

void* determineMin(void* fileName)
{
    //creates the file pointer
    FILE *fileptr;

    //creates the file
    fileptr = fopen(*(char**)fileName,"r");

    int number=0, min=0;

    if(fileptr)
    {

        fscanf(fileptr,"%i ",&number);

        min = number;

        printf("%i",min);
    }

    fclose(fileptr);
}

我遇到的问题是这个。 在类型转换和取消引用 void* fileName 并使用它打开文件之后。 该文件成功打开,但它不会读取任何输入。 我目前没有遍历每个数字,因为有 15000 个,所以我只尝试了一次,但它似乎不起作用。 是否有使用带有 pthreads 的文件的规则我忘记了,这会阻止 fscanf 正常工作?

您将argv作为线程参数传递。 所以*(char**)fileName实际上是argv[0]这绝对不是你想要的。 试试((char**)fileName)[1]

PS您可以使用NULL代替&attr IIRC(如果您实际上不需要c的属性)。

您将argv作为pthread_create()参数传递。 它与argv[0]类似,它表示可执行文件本身。 要传递文件名,请将argv替换为argv[1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM