После открытия файла в коде OP есть такая проверка:
if (memin != NULL) {
perror(strerror(errno));
}
Итак, если открытие прошло успешно , выводится строка ошибки.В моей реализации он сообщает:
Success: Success
Никаких действий не предпринимается, если не удается открыть файл.
Когда дело доходит до фактического чтения всехстрок в файле, есть некоторые другие проблемы.Буфер (массив char
) с именем line
размером 8 динамически выделяется и передается в fgets
:
while ((line = fgets(line, 10, (FILE *)memin)) != NULL) {
// ^^
Обратите внимание, что 10 также передается как размер буфера, что неверно, поскольку позволяет fgets
записывать данные за пределы выделенного массива.
Кроме того, учитывая, что компилятором OP является MSVC 2017, я предполагаю, что этот кодработает в Windows, поэтому есть вероятность, что в файле строки заканчиваются последовательностью "\r\n"
, а не одиночной '\n'
.Даже если OP уверен, что каждая строка представляет собой строку из 8 символов, fgets
требуется буфер по крайней мере размером 8 + 3 (8 + '\ r' + '\ n' + '\ 0'), чтобы прочитать их безопасно.
Рассмотрим, как эти предложения реализованы в этом фрагменте:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MEM_SIZE 1024u
#define LINE_SIZE 128u
#define STR_SIZE 8u
int main(int argc, char *argv[])
{
// Try to open the input file
if (argc < 2) {
fprintf(stderr, "Missing file name in command line.\n");
return EXIT_FAILURE;
}
FILE *memin = fopen(argv[1], "r");
if (memin == NULL) {
fprintf(stderr, "Unable to open file [%s].\n", argv[1]);
return EXIT_FAILURE;
}
// I'd use plain arrays to store the lines
char memory[MEM_SIZE][STR_SIZE + 1] = {{'\0'}};
char line[LINE_SIZE] = {'\0'};
size_t count = 0;
while ( count < MEM_SIZE && fgets(line, LINE_SIZE, memin) ) {
size_t length = strcspn(line, "\r\n");
if (length > STR_SIZE) {
fprintf(stdout, "Warning, line too long: %zu.\n", count);
length = STR_SIZE;
}
memcpy(memory[count], line, length);
memory[count][STR_SIZE] = '\0';
++count;
}
for ( size_t i = 0; i < count; ++i ) {
printf("[%s]\n", memory[i]);
}
}