У меня есть программа, которая читает из .txt-файлаТе же файлы .txt, разные размеры?
Я использую приглашение cmd для выполнения программы с именем текстового файла для чтения.
например: program.exe myfile.txt
Проблема заключается в том, что иногда это работает, иногда нет.
Оригинальный файл - 130KB и не работает. Если я копирую/вставляю содержимое, файл составляет 65 КБ и работает. Если я копирую/вставляю файл и переименовываю его, он составляет 130 КБ и не работает.
Любые идеи?
После более тестирования показывает, что это то, что делает это не работает:
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
}
}
работает ли он или нет, код внутри цикла в то время как запускается на выполнение.
Когда он работает, tmp на самом деле имеет значение. Когда он не работает, tmp не имеет значения.
EDIT:
Благодаря sneftel, мы знаем, в чем проблема, Для меня использовать fgetws() вместо fgets(), мне нужно TMP быть wchar_t * вместо полукокса * , Тип отливки, похоже, не работает. Я попытался изменить объявление 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 не работает.
Теперь я ищу способ просто преобразовать файл из UTF-16 в UTF-8, поэтому tmp может иметь тип char * Я нашел это, что похоже, что оно может быть полезно, но в примере, которое оно использует ввод от пользователя как UTF-16, как этот вход может быть взят из файла? http://www.cplusplus.com/reference/locale/codecvt/out/
Спасибо! Это звучит так, будто это может быть так :) Знаете ли вы, где я могу начать искать, чтобы иметь дело с «всем, что Unicode джаз»? – user1420563
Существуют широкоформатные версии большинства стандартных процедур ввода/вывода. См., Например, документацию 'fgetws'. Проблема в том, что вам необходимо либо заранее определить, либо узнать, что файл имеет широкосимвольное кодирование.Лучше всего придерживаться ASCII или UTF-8; последнее позволяет вам делать множество вещей с международными символами, содержащими строки, как если бы они были ASCII, хотя и не все. – Sneftel