Итак, я пишу параллельную проверку решения судоку на C, но, похоже, столкнулся с проблемой чтения в простом старом файле .txt.
Вот код для чтения в файле:
FILE* fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Cannot open file\n");
return 1;
}
//Begin copying file using fgetc
int c;
while ((c = fgetc(fp)) != EOF) {
for (int i = 0; i < PUZZLE_SIZE; ++i) {
for (int j = 0; j < PUZZLE_SIZE; ++j) {
if (c != -38) { //-38 is newline
//puzzle is a global array of ints
puzzle[i][j] = c - 48; //handles ASCII to int (1-9) conversion
}
}
}
}
fclose(fp);
Файл .txt выглядит следующим образом:
534678912
672195348
198342567
859761423
426853791
713924856
961537284
287419635
345286179
Когда я печатаю c - 48, я получаю ожидаемые значения; когда я печатаю Puzzle[i][j] внутри циклов, я снова получаю нормальные значения. Однако, когда я потом смотрю на свой массив головоломок, каждое значение устанавливается равным 9; Я не могу, убей меня, понять, почему. Есть ли проблема с памятью/областью действия, о которой я не знаю?
if (c != -38) { //-38 is newline
Я искренне сомневаюсь, что --›if (c != '\n') { ...}
Такжеpuzzle[i][j] = c - 48;
--›puzzle[i][j] = c - '0';
Кстати,if (c == '\n) break;
понятнее и надежнее и избегает вложенности. - person wildplasser   schedule 27.03.2014fgetc()
будет либо неотрицательным целым числом в диапазоне 0..UCHAR_MAX (обычно 255), либо EOF (обычно -1). Не будет -38 ни при каких известных обстоятельствах. - person Jonathan Leffler   schedule 27.03.2014char
со знаком, поэтому вы можете иметь любое значение от -128 до 127, либо вы используетеunsigned char
, который может содержать числа только от 0 до 255. - person Taiki   schedule 27.03.2014fgetc()
страницы руководства явно говорят, что он возвращает значение символа, приведенного кunsigned char
или EOF. Это работает именно так, потому чтоEOF
всегда отрицательно; это позволяет реализациям, использующим отрицательные символы, справиться с этим - в противном случаеEOF
может быть неправильно интерпретирован как допустимый символ. Таким образом,fgetc()
всегда возвращает положительное значение или отрицательную константу, обозначающуюEOF
. - person Filipe Gonçalves   schedule 27.03.2014fgetc
гласит: [...] функцияfgetc
получает этот символ какunsigned char
, преобразованный вint
[...] (Реализация может законно использовать -38 в качестве EOF, но ни одна известная реализация этого не делает.) - person Jonathan Leffler   schedule 27.03.2014c
- это int, а не char. Тип возвращаемого значения из fgetc() также является типом int. - person wildplasser   schedule 27.03.2014int
оно будет содержать ведущие нули, в отличие от того, что происходит с-1
. - person Filipe Gonçalves   schedule 27.03.2014