我有一个从.txt文件中读取的程序
我使用cmd提示符执行程序,其中包含要读取的文本文件的名称。
ex:program.exe myfile.txt
问题在于它有时会起作用,有时却不起作用。
原始文件是130KB,不起作用。 如果我复制/粘贴内容,该文件是65KB并且工作。 如果我复制/粘贴文件并重命名,则为130KB,不起作用。
有什么想法吗?
经过更多测试后,它表明这是不起作用的原因:
int main(int argc, char *argv[])
{
char *infile1
char tmp[1024] = { 0x0 };
FILE *in;
for (i = 1; i < argc; i++) /* Skip argv[0] (program name). */
{
if (strcmp(argv[i], "-sec") == 0) /* Process optional arguments. */
{
opt = 1; /* This is used as a boolean value. */
/*
* The last argument is argv[argc-1]. Make sure there are
* enough arguments.
*/
if (i + 1 <= argc - 1) /* There are enough arguments in argv. */
{
/*
* Increment 'i' twice so that you don't check these
* arguments the next time through the loop.
*/
i++;
optarg1 = atoi(argv[i]); /* Convert string to int. */
}
}
else /* not -sec */
{
if (infile1 == NULL) {
infile1 = argv[i];
}
else {
if (outfile == NULL) {
outfile = argv[i];
}
}
}
}
in = fopen(infile1, "r");
if (in == NULL)
{
fprintf(stderr, "Unable to open file %s: %s\n", infile1, strerror(errno));
exit(1);
}
while (fgets(tmp, sizeof(tmp), in) != 0)
{
fprintf(stderr, "string is %s.", tmp);
//Rest of code
}
}
无论是否有效,while循环中的代码都会被执行。
当它工作时,tmp实际上有一个值。 当它不起作用时,tmp没有价值。
编辑:
感谢sneftel,我们知道问题是什么, 对于我来说使用fgetws()而不是fgets(),我需要将tmp变成wchar_t *而不是char *。 类型转换似乎不起作用。 我尝试将tmp的声明更改为 wchar_t tmp [1024] = {0x0}; 但我意识到tmp是我的代码中其他地方使用的strtok()中的参数。 我在这里就是我尝试过的功能:
//tmp is passed as the first parameter in parse()
void parse(wchar_t *record, char *delim, char arr[][MAXFLDSIZE], int *fldcnt)
{
if (*record != NULL)
{
char*p = strtok((char*)record, delim);
int fld = 0;
while (p) {
strcpy(arr[fld], p);
fld++;
p = strtok('\0', delim);
}
*fldcnt = fld;
}
else
{
fprintf(stderr, "string is null");
}
}
但是在strtok中对char *进行类型转换也不起作用。
现在我正在寻找一种方法将文件从UTF-16转换为UTF-8,因此tmp可以是char *类型 我发现这看起来很有用,但在示例中它使用来自用户的输入作为UTF-16,如何从文件中取出输入? http://www.cplusplus.com/reference/locale/codecvt/out/
答案 0 :(得分:1)
这听起来很像原始文件是UTF-16编码的。在文本编辑器中复制/粘贴它时,然后将结果保存为新的(默认编码)(ASCII或UTF-8)文本文件。由于单个字符在UTF-16编码文件中占用2个字节,而在UTF-8编码文件中只占1个字节,因此当您将其保存时,文件大小将大致减半。
UTF-16很好,但您需要使用支持Unicode的功能(即不是fgets
)才能使用它。如果您现在不想处理所有Unicode爵士乐,并且您实际上没有任何非ASCII字符可以在文件中处理,只需进行手动转换(使用您的复制/粘贴或使用命令行实用程序)在运行程序之前。