1、每次读一行,用fgets
2、假设都是以空格分隔,用sscanf从刚才fgets读到的字符串中取出一段
3、对其中的字符用isdigital判断是否都为数字,如果是,就atoi转换成数字,写入另一个文件
这样做就不需要 *** 作文件指针,基本就是使用解析字符串格式的方法就可以了
配置文件为 conf.txt测试代码如下,注意链接的时候加上 -lpthread 这个参数
#include <stdio.h>
#include <errno.h>//perror()
#include <pthread.h>
#include <unistd.h>//sleep()
#include <time.h>// time()
#include <stdlib.h>//rand()
#define FD "conf.txt"
typedef void *(*fun)(void *)
struct my_struct
{
unsigned time_to_wait
int n
}
void *test_thread(struct my_struct *)
int main (int argc, char const *argv[])
{
FILE *fp = fopen(FD, "r")
if (fp == NULL)
{
perror(FD)
return -1
}
srand((unsigned)time(NULL))//初始化随机种子
int thread_count
fscanf(fp, "%d", &thread_count)
fclose(fp)
if (thread_count <= 0)
{
return -1
}
pthread_t *ptid = (pthread_t *)malloc(sizeof(pthread_t) * thread_count) //保存线程ID
int i
for (i = 0i <thread_counti++)
{
int tw = rand() % thread_count + 1//随机等待时间
struct my_struct * p = (struct my_struct *)malloc(sizeof(struct my_struct))
if (p == NULL)
{
perror("内存分配错误")
goto ERROR
}
p->time_to_wait = tw
p->n = i + 1
int rval = pthread_create(ptid + i, NULL, (fun) test_thread, (void *)(p))//注意这里的强制转换(两个)
if (rval != 0)
{
perror("Thread creation failed")
goto ERROR
}
//sleep(1) //这句加也可以,不加也可以。最开始的时候加上这个是为了让两个线程启动的时候之间有一定的时间差
}
printf("主线程启动\n\n")
fflush(stdout)
for (i = 0i <thread_counti++)
{
pthread_join(*(ptid + i), NULL)//等待所有线程退出。
}
printf("\n主线程退出\n")
ERROR:
free(ptid)
return 0
}
void *test_thread(struct my_struct * p) //线程启动的时候运行的函数
{
printf("第%d个线程启动,预计运行%d秒\n", p->n, p->time_to_wait)
fflush(stdout)
sleep(p->time_to_wait) //让线程等待一段时间
printf("第%d个线程结束\n", p->n)
fflush(stdout)
free(p)
return NULL
}
你的第二个问题我在百度HI回你了~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)