使用没有字符串且没有 structs/_p 的文本文件 != nullptr“错误

Work with text files without string and without structs/_p != nullptr" error

提问人:Vlad Chuklin 提问时间:11/4/2023 最后编辑:genpfaultVlad Chuklin 更新时间:11/4/2023 访问量:68

问:

我希望按顺序从文本文件中读取数据

<last name>,<group_number>,<score1>,<score2>,<score3>;<last name>...

...等等。学生人数不详。字符串和结构不能在程序中使用。阅读后,我会检查有债务的学生(分数低于 3)。我写了代码,但它不能正常工作。将不需要的内容写入控制台和文件。

并弹出一个错误,代码为_p != nullptr“错误:

enter image description here

代码有什么问题?

功能:getSize

int getSize(const char* filename) {
    ifstream file(filename); // Відкриття файлу для читання

    if (!file.is_open()) {
        cout << "Не вдалось відкрити файл!" << endl;
        return 0;
    }

    int fileSize = 0; // Змінна для зберігання розміру файлу

    while (!(file.eof())) { // Цикл, поки не досягнуто кінця файлу
        char currentChar; // Змінна для зберігання поточного символу
        file.get(currentChar); // Читання символу з файлу
        fileSize++;  // Збільшення розміру файлу на один
    }

    file.close();

    return fileSize;
}

功能:read_and_write_data_1()

void read_and_write_data_1() {
    const char* namefile1 = "results.txt";
    ofstream outfile(namefile1);
    if (!outfile.is_open()) { // Перевірка, чи файл відкритий
        cout << "Не вдалось відкрити файл для запису " << endl;
        return;
    }
    const char* namefile = "students.txt";
    int fileSize = getSize(namefile); // Отримання розміру файлу
    ifstream infile; // Створення об'єкта для читання з файлу
    infile.open(namefile); // Відкриття файлу
    char* str = new char[fileSize]; // Створення масиву символів для зберігання даних з файлу
    infile.getline(str, fileSize); // Читання даних з файлу у масив
    char* reader;
    char* next_token1{};
    reader = strtok_s(str, ";,", &next_token1);


    while (reader) {
        char surname[12];
        int group_number, grade1, grade2, grade3;

        strncpy_s(surname, sizeof(surname), reader, _TRUNCATE);
        reader = strtok_s(nullptr, ",", &next_token1);
        group_number = atoi(reader);
        reader = strtok_s(nullptr, ",", &next_token1);
        grade1 = atoi(reader);
        reader = strtok_s(nullptr, ",", &next_token1);
        grade2 = atoi(reader);
        reader = strtok_s(nullptr, ",", &next_token1);
        grade3 = atoi(reader);

        bool has_debt = (grade1 < 3) && (grade2 < 3) && (grade3 < 3);

        if (has_debt) {
            cout << surname << endl;
            outfile << surname << endl;
        }

    }
    
    infile.close(); 
    outfile.close();
    delete[] str;
    
}
C++ 字符串 文本文件 nullptr

评论

4赞 Barmar 11/4/2023
为什么 while(!feof(file)) 总是错的
1赞 Remy Lebeau 11/4/2023
为什么要使用低效的循环来计算文件的大小?只将文件流搜索到文件末尾,然后查询位置要高效得多。或者,只需向文件系统本身询问文件大小 via 或等效文件。但是,在这种情况下,没有理由将整个文件读入预先分配的缓冲区,只需在循环中使用 or 或。您不需要一次将整个文件读入内存。get()std::filesystem::file_size()istream::getline()std::getline()
1赞 001 11/4/2023
仅供参考,有一个重载,它需要第三个参数:分隔符。因此,与其一次读取整个文件,不如用 或 del 反复调用它。getline','';'
1赞 Thomas Matthews 11/4/2023
更喜欢使用和方法。请记住,修改字符串。另请参见 ,它被视为 I/O 设备,因此您可以使用 和 。std::stringfind()strtok()std::stringstreamstd::stringoperator>>std::getline
1赞 user4581301 11/4/2023
利用 IDE 进行调试,然后检查调用堆栈以收集有关崩溃站点的信息以及程序如何到达那里。再次在调试器中运行程序,并使用该信息在崩溃之前停止调试器,以收集更多信息。继续收集更多信息以缩小搜索范围,直到您不会错过发现错误。如果你能在那个时候解决它,那就太棒了。如果没有,请构建一个最小的可重现示例,并用它替换问题中的代码。

答: 暂无答案