鱼C论坛

 找回密码
 立即注册
查看: 1504|回复: 1

萌新求助,为什么fgetws一直读取不到呀,errno是22

[复制链接]
发表于 2022-4-1 16:59:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Levi_Marvin 于 2022-4-1 17:03 编辑

萌新求助,为什么 fgetws 一直读取不到呀,errno是22
错误位置在 student.c 的 DATABASE_STUDENT_del() 函数中 while 里的 fgetws()

main.c

  1. int main() {
  2.     if (setlocale(LC_ALL, "zh_CN.utf8") == NULL) {
  3.         return 2;
  4.     }

  5.     int select = 0;
  6.     DATABASE *db = malloc(sizeof(DATABASE));
  7.     STUDENT *st = malloc(sizeof(STUDENT));
  8.     STUDENT_new(st);
  9.     wprintf_s(TEXT_MENU_WELCOME);
  10.     wprintf_s(L"请输入你的选择:");
  11.     wscanf_s(L"%d", &select);
  12.     switch (select) {
  13.         case 0:
  14.         {
  15.             break;
  16.         }
  17.         case 1:
  18.         {
  19.             wchar_t *input_no = (wchar_t *) malloc(sizeof(wchar_t *)),
  20.             *input_name = (wchar_t *) malloc(sizeof(wchar_t *)), *input_sex = (wchar_t *) malloc(sizeof(wchar_t *)),
  21.             *input_birthday = (wchar_t *) malloc(sizeof(wchar_t *)), *input_workday = (wchar_t *) malloc(sizeof(wchar_t *)),
  22.             *input_address = (wchar_t *) malloc(sizeof(wchar_t *)), *input_telephone = (wchar_t *) malloc(sizeof(wchar_t *)),
  23.             *input_email = (wchar_t *) malloc(sizeof(wchar_t *));
  24.             *input_no = 0, *input_name = 0, *input_sex = 0, *input_birthday = 0, *input_workday = 0,
  25.             *input_address = 0, *input_telephone = 0, *input_email = 0;
  26.             wprintf_s(TEXT_MENU_STU_ADD);
  27.             wprintf_s(L"    >");
  28.             wscanf(
  29.                     L"%ls %ls %ls %ls %ls %ls %ls %ls",
  30.                     input_no, input_name, input_sex, input_birthday, input_workday,
  31.                     input_address, input_telephone, input_email
  32.                     );
  33.             STUDENT_set(st,
  34.                         input_no, input_name, input_sex,
  35.                         input_birthday, input_workday,
  36.                         input_address, input_telephone, input_email
  37.             );
  38.             DATABASE_STUDENT_put(db, st);
  39.             wprintf_s(L"操作成功完成!");
  40.             break;
  41.         }
  42.         case 2:
  43.         {
  44.             wchar_t *input = (wchar_t *) malloc(sizeof(wchar_t *));
  45.             *input = 0;
  46.             wprintf_s(TEXT_MENU_STU_QUE);
  47.             wprintf_s(L"    >");
  48.             wscanf(L"%ls", input);
  49.             DATABASE_STUDENT_get(db, st, input);
  50.             STUDENT_printf(st);
  51.             wprintf_s(L"操作成功完成!");
  52.             break;
  53.         }
  54.         case 3:
  55.         {
  56.             wchar_t *input = (wchar_t *) malloc(sizeof(wchar_t *));
  57.             *input = 0;
  58.             wprintf_s(TEXT_MENU_STU_DEL);
  59.             wprintf_s(L"    >");
  60.             wscanf(L"%ls", input);
  61.             DATABASE_STUDENT_del(db, st, input);
  62.             break;
  63.         }
  64.         default:
  65.         {
  66.             wprintf_s(L"输入有误!");
  67.         }
  68.     }

  69.     STUDENT_free(st);
  70.     return 0;
  71. }
复制代码


student.c

  1. int DATABASE_STUDENT_del(DATABASE *pDb, STUDENT *pSt, wchar_t *pCo)
  2. {
  3.     int rel = 0;
  4.     DATABASE *pDb_tmp = malloc(sizeof(DATABASE));
  5.     STUDENT *pSt_tmp = malloc(sizeof(STUDENT));

  6.     DATABASE_new(pDb, DATABASE_FILENAME);
  7.     DATABASE_new(pDb_tmp, "tmp.txt");
  8.     STUDENT_new(pSt_tmp);
  9.     DATABASE_STUDENT_get(pDb, pSt_tmp, pCo);
  10.     int availableSize = DATABASE_STUDENT_DATA_LINE_MAXSIZE;
  11.     wchar_t input_data[DATABASE_STUDENT_DATA_LINE_MAXSIZE];
  12.     wchar_t line[DATABASE_STUDENT_DATA_LINE_MAXSIZE];

  13.     for (int i = 0; i < DATABASE_STUDENT_DATA_LINE_MAXSIZE; ++i) {
  14.         input_data[i] = '\0';
  15.         line[i] = '\0';
  16.     }

  17.     DATABASE_STUDENT_get(pDb, pSt, pCo);
  18.     STUDENT_printf(pSt);

  19.     wcscat_s(input_data, availableSize, pSt->no);
  20.     availableSize -= STUDENT_NO_SIZE;
  21.     wcscat_s(input_data, availableSize, DATABASE_STUDENT_SPLIT_CHAR);
  22.     availableSize -= (int) wcslen(DATABASE_STUDENT_SPLIT_CHAR);
  23.     wcscat_s(input_data, availableSize, pSt->name);
  24.     availableSize -= (int) wcslen(pSt->name);
  25.     wcscat_s(input_data, availableSize, DATABASE_STUDENT_SPLIT_CHAR);
  26.     availableSize -= (int) wcslen(DATABASE_STUDENT_SPLIT_CHAR);
  27.     wcscat_s(input_data, availableSize, pSt->sex);
  28.     availableSize -= (int) wcslen(pSt->sex);
  29.     wcscat_s(input_data, availableSize, DATABASE_STUDENT_SPLIT_CHAR);
  30.     availableSize -= (int) wcslen(DATABASE_STUDENT_SPLIT_CHAR);
  31.     wcscat_s(input_data, availableSize, pSt->birthday);
  32.     availableSize -= (int) wcslen(pSt->birthday);
  33.     wcscat_s(input_data, availableSize, DATABASE_STUDENT_SPLIT_CHAR);
  34.     availableSize -= (int) wcslen(DATABASE_STUDENT_SPLIT_CHAR);
  35.     wcscat_s(input_data, availableSize, pSt->workday);
  36.     availableSize -= (int) wcslen(pSt->workday);
  37.     wcscat_s(input_data, availableSize, DATABASE_STUDENT_SPLIT_CHAR);
  38.     availableSize -= (int) wcslen(DATABASE_STUDENT_SPLIT_CHAR);
  39.     wcscat_s(input_data, availableSize, pSt->address);
  40.     availableSize -= (int) wcslen(pSt->address);
  41.     wcscat_s(input_data, availableSize, DATABASE_STUDENT_SPLIT_CHAR);
  42.     availableSize -= (int) wcslen(DATABASE_STUDENT_SPLIT_CHAR);
  43.     wcscat_s(input_data, availableSize, pSt->telephone);
  44.     availableSize -= (int) wcslen(pSt->telephone);
  45.     wcscat_s(input_data, availableSize, DATABASE_STUDENT_SPLIT_CHAR);
  46.     availableSize -= (int) wcslen(DATABASE_STUDENT_SPLIT_CHAR);
  47.     wcscat_s(input_data, availableSize, pSt->email);

  48.     while (1) {
  49.         if (fgetws(line, DATABASE_STUDENT_DATA_LINE_MAXSIZE, pDb->file) == NULL) {
  50.             wprintf_s(L"fgetws() err in DATABASE_STUDENT_del() in student.c");
  51.         }
  52.         int e = errno;
  53.         if (e != 0) {
  54.             wprintf_s(L"%ls", strerror(e));
  55.         }
  56.         if (wcscmp(input_data, line) != 0) {
  57.             rel = fputws(line, pDb_tmp->file);
  58.             if (rel != 0) {
  59.                 rel = 1;
  60.                 break;
  61.             }
  62.         }
  63.         if (!wcscmp(line, L"\n") || !wcscmp(line, L"\r") || !wcscmp(line, L"\r\n")) {
  64.             break;
  65.         }
  66.     }

  67.     STUDENT_free(pSt_tmp);
  68.     DATABASE_free(pDb_tmp);
  69.     DATABASE_free(pDb);
  70.     return rel;
  71. }
复制代码


database.c
  1. DATABASE *DATABASE_new(DATABASE *pDb, const char *pFn)
  2. {
  3.     pDb->dataNum = 0;
  4.     if (fopen(pFn, "r") == NULL) {
  5.         pDb->file = fopen(pFn, "w");
  6.         if (errno != 0) {
  7.             printf_s(strerror(errno));
  8.         }
  9.         fclose(pDb->file);
  10.     }
  11.     pDb->file = fopen(pFn, "a+");
  12.     /*if (errno != 0) {
  13.         printf_s(strerror(errno));
  14.     }*/

  15.     return pDb;
  16. }

  17. int DATABASE_free(DATABASE *pDb) {
  18.     int rel;
  19.     rel = fclose(pDb->file);
  20.     if (rel != 0) {
  21.         printf_s(strerror(errno));
  22.         rel = 1;
  23.     }
  24.     free(pDb->file);
  25.     pDb->file = NULL;

  26.     return rel;
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-3 20:01:03 | 显示全部楼层
把代码上全。重新开个贴吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 18:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表