美文网首页
2-ndk学习之c++基础篇(05)

2-ndk学习之c++基础篇(05)

作者: ftd黑马 | 来源:发表于2020-03-09 18:44 被阅读0次

文件操作

首先是c语言读取文件:
需要先添加头文件,

#include <ostream> // 输出
#include <istream> // 输入

    // 1,路径
    // 2,模式 r:可以读   w:可以写
    // 写操作
    FILE* file1 = fopen("E:\\NDK\\file.txt", "w");
    fprintf(file1, "今天是多少%d号", 9);
    fclose(file1); // 必须关闭资源

    // 读操作
    FILE* file2 = fopen("E:\\NDK\\file.txt", "r");
    // 定义接受的缓冲
    char buffer[1024]; // 1023 + \0
    fscanf(file2, "%s", buffer);
    cout << "文件里面的内容是:" << buffer << endl;
    fclose(file2);

    // 使用循环读取,内容较多的
    // 缺点:一旦遇到空格,就直接返回
    FILE * file3 = fopen("E:\\NDK\\file.txt", "r");
    char buffer2[1024];
    while (!feof(file3)) {
        fscanf(file3, "%s", buffer2);
        cout << "循环 文件里面的内容是:" << buffer2 << endl;
    }
    fclose(file3);

    // 最常用的,相当于读取一行 一行
    // 遇到换行 或者 遇到 \0 也直接返回了
    // 我们要去解决 上面循环读取的缺点  fgets
    FILE *file4 = fopen("E:\\NDK\\file.txt", "r");
    char buffer3[1025]; // 只能装1024 + \0
    while (!feof(file4)) {
        fgets(buffer3, 1024, file4);
        cout << "循环2 文件里面的内容是:" << buffer3 << endl;
    }
    fclose(file4);

然后是c++读取文件:
先添加头文件:

    #include <ostream>
    #include <istream>
    #include <fstream>

    char * fileVar = "E:\\NDK\\file3.txt";
    // 写入操作
    char data[200];
    ofstream outFile; // 代表以写的模式去打开文件(输出对象)
    outFile.open(fileVar);

    // 获取用户在控制台输入的信息
    cout << "请输入您要保存的信息.." << endl;
    cin >> data; // 执行此行代码后,data就已经数据了,类似于java中的键盘录入,把键盘输入的赋值给了data
    outFile << data << endl;//把data的数据赋值给outFile
    outFile.close();

    // 读取操作
    char mydata[200];
    cout << "开始自动的去读取 刚刚保存到文件里面的内容...." << endl;
    ifstream  ifstreamVar; // 代表输入
    ifstreamVar.open(fileVar);
    ifstreamVar >> mydata;
    // 下面是输出
    cout << mydata << endl;
    ifstreamVar.close();

多线程入门

c++的多线程是一个很难的点,也是很重要的一个点。
我这里使用的是标准库中的pthread库,主要api就是ptrhead_create

void * customPThreadMethod01(void *pVoid){
    int result = *static_cast<int *>(pVoid);
    LOGD("我是耗时操作,%d", result);
    return 0;
}

int main() {
    pthread_t pthread;
    int value = 200;

    /**
     * int pthread_create(pthread_t* __pthread_ptr, 1,线程id
     * pthread_attr_t const* __attr,   2,线程属性
     * void* (*__start_routine)(void*),  3,函数指针---java中的run方法
     * void*);  4,函数指针中传递的值
     */
    pthread_create(&pthread,0,customPThreadMethod01,&value);

    //先让耗时任务执行完毕后,在执行下面的代码
    pthread_join(pthread,0);// join是第二个参数是线程执行完后返回的结果

    LOGD("main函数执行完毕");
    return 0;
}
//这里有个概念是分离线程和非分离线程
// 什么是 分离线程  和 非分离线程 ?
    // 答:非分离线程,要等到耗时任务执行全部完成以后,先执行异步任务,才会执行join后面关联的代码逻辑
    //       分离线程,各玩各的,老死不相往来,所以就造成了,不管异步任务是否执行完毕,该结束就结束

这段代码中,如果不加join函数等待,那么在子线程中result的值是不断变化的,我咨询过c++同事,了解到如果不加线程等待,main函数就有可能在子线程执行结束之前就执行完毕并退出,在这个程序中,value变量定义在主线程(main函数)空间,主线程退出,value变量所在的内存被系统回收,子线程再访问value变量时得到的就是随机值。
也就是说,一般,主线程要保证所有子线程退出后再退出。
所以平时c++开发过程中,遇到多线程,主线程最后都是要调用join函数等待其它线程执行完毕。

线程的安全问题,互斥锁

// 定义一个全局的队列,用于存储使用
queue<int> saveAllData;
// 定义一个互斥锁
pthread_mutex_t pLock; // 互斥锁,不能是野指针,否则是坑
void * customThreadMethod(void * pVoid) {
    // 10条线程,同时运行,并且对队列的数据 “进行操作” 还要保证数据的安全 (加锁)
    pthread_mutex_lock(&pLock);
    if (!saveAllData.empty()) {
        LOGD("获取队列的数据:%d\n", saveAllData.front());
        saveAllData.pop(); // 把数据弹出去,删除的意思
    } else {
        printf("队列中没有数据了\n");
        LOGD("队列中没有数据了\n");
    }
    // 解除锁定,是为了让其他多线程,可以进来的操作,这就是解锁的目的
    pthread_mutex_unlock(&pLock);

    return 0;
}
int main() {
    // 初始化互斥锁
    pthread_mutex_init(&pLock, 0);
    // 给队列初始化数据
    for (int j = 1000; j < 1006; j++) {
        saveAllData.push(j);
    }
    pthread_t pthreadIDArray[10]; // 允许有野指针
    for (int i = 0; i < 3; i++) {
        pthread_create(&pthreadIDArray[i], 0, customThreadMethod, &i);
    }

    system("pause"); // 让main函数,不要去结束,为了演示 多线程

    // 回收互斥锁
    pthread_mutex_destroy(&pLock);
    return 0;
}

相关文章

  • 2-ndk学习之c++基础篇(05)

    文件操作 首先是c语言读取文件:需要先添加头文件, 然后是c++读取文件:先添加头文件: 多线程入门 c++的多线...

  • 2-ndk学习之c++基础篇(1)

    c++是在c的基础上进行封装的,数据类型基本上都差不多,最大的差异就表现在c++是面向对象的语言,在c++中,有c...

  • 2-ndk学习之c++基础篇(02)

    由于clion有时间过期的限制,从这篇文章开始,之后所有的代码都在as上敲写学习了。 as上新建一个c++项目 新...

  • 2-ndk学习之c++基础篇(03)

    在c++源码中,会有很多俗称“鬼画符”的代码,很多都是用到了运算符重载 运算符重载 在函数中调用: 继承 在mai...

  • 2-ndk学习之c++基础篇(04)

    容器 c++中的容器分为两种:1.序列化容器,元素的排序关系,和元素本身没有任何关系,是我们在添加的时候的顺序导致...

  • 2-ndk学习之c++基础篇(06)

    这篇文章写一下c++经典案例,生产者消费者模式,我在代码中的注释写的很详细,这边就不多写了,干货哦!!!工具类代码...

  • c++学习笔记之基础篇

    c++学习笔记系列:http://blog.csdn.net/column/details/17301.html ...

  • HIDL实战笔记

    目录 第一篇:HIDL学习笔记之HIDL C++(第一天)第二篇:HIDL学习笔记之HIDL C++(第二天)第三...

  • C++ 总结 (一、基础篇)

    C++ 总结 (一、基础篇) 官网 C++ 完全兼容C语言,但是有自己的语法特点,本文总结了C++的基础知识。记录...

  • c++学习之基础篇——2.变量

    what 简单来讲,一个程序想要达到的效果就是,将一定的输入灌入名为‘程序’的这根管子中,从而输出你想要的结果。 ...

网友评论

      本文标题:2-ndk学习之c++基础篇(05)

      本文链接:https://www.haomeiwen.com/subject/tukpdhtx.html