我需要获得正确的波兰语字符“ąężźćśół”。我使用了一些解决方案,例如 setlocale
、system chcp
、wchar_t
。只要我不使用文件/列表,一切都会顺利。 wscanf
、wprintf
和 wchar_t
完美运行。
但是,如果我尝试从文件中读取某些内容并将其保存到列表中(即使是数组),然后尝试将其显示到屏幕上,我将无法获得正确的波兰语字符,并且在出现以下情况时列表中,我时不时会得到不同的结果,例如 z` 、 A2 ,就像来自无处的随机字符。我一直试图通过使用带有 w(wide) 变体的 fscanf
和 fgets
来获得良好的结果,但它不起作用。我是不是搞错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
struct dyk{
wchar_t line[200];
struct dyk *next;
};
typedef struct dyk dyk;
void printdyk(char name[100]){
dyk *wyp;
wyp = malloc(sizeof(dyk));
wchar_t yt[100];
FILE *dyktando;
dyktando = fopen(name, "r+");
if(dyktando == NULL){
wprintf(L"Błąd otwarcia pliku!\n"); //Can't open file
}else{
fgets(&wyp->line, sizeof(dyk), dyktando); //reading from file and send to the list
wprintf(L"%s\n", wyp->line); //write text from the list on the screen
wchar_t yt[100];
wscanf(L"%s", &yt); //testing strings comparing, so I have to put some variables
int n=strcmp(yt, wyp->line); //str compare
printf("%d", n); //result, it gives me -1 every time
}
fclose(dyktando);
}
我用只包含一个字符“ż”的txt文件测试了函数。无法正确读取文件。在主函数的开头我放置了这两行:
system("chcp 852");
setlocale(LC_ALL, ".852");
我正在使用代码块、mingw32-gcc 编译器,并且没有标志。
最佳答案
您没有使用wchar_t
代码中随处可见的兼容函数。特别是:
fgets(&wyp->line, sizeof(dyk), dyktando); //reading from file and send to the list
wchar_t
兼容版本是 fgetws
。另外,wyp->line
(没有 &
运算符)是正确的参数。
int n=strcmp(yt, wyp->line); //str compare
wcscmp
应该使用它来代替。
另请注意 sizeof
在wchar_t
上当函数期望长度为字符而不是字节时,数组不正确(如fgetws
)。
关于c - 使用文件和列表修改 C 中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54200889/