по какой-то причине я получаю исключение после строки:
currentString[i] = *currentChar;
Этот код предназначен для сбора всех символов из файла, пока он не встретит символ ';', и поместить их в строку. Кто-нибудь знает, в чем дело? Благодарность! Это весь код:
char currentString[100] = { 0 };
char *currentChar;
//opening the input file
FILE *input = fopen("input.txt", "r");
//if the file doesn't exist, the pointer will contain NULL
if (input == NULL)
{
exit(1);
}
//assigning the start of the input file adress to currentChar
currentChar = input;
//while the current character isn't the last character of the input file
while (currentChar < input + strlen(input) + 1)
{
while (currentChar != ';')
{
currentString[i] = *currentChar;
printf("%c", *currentChar);
currentChar = currentChar + 1*sizeof(char);
i++;
}
}
В качестве связанного примечания, sizeof(char) всегда по определению 1, поэтому умножать на него нет необходимости. И хотя здесь ничего не ломается (потому что это всегда 1), арифметика указателей не требует умножения на размер указанного типа, например, int *p = &i; p += 2; продвигает p на два int, а не на два байта.
Кроме того, вам необходимо убедиться, что вы не записываете в currentString более 99 символов. (Если вы напишете ровно 100, не хватит места для завершающего нуля, который требуется строкам C, а если вы напишете больше 100, вы выйдете за пределы, поскольку вы определили его как char currentString[100].)
@Arkku Интересно, почему вы не добавляете эти положительные моменты в свой ответ, а публикуете их как комментарии здесь
@Ctx Хмм, я думаю, я чувствую, что «актуальный вопрос» касается чтения файла, и эти дополнительные моменты, хотя и важно знать, не имеют прямого отношения к этому, а скорее не связаны с проблемами, специфичными для кода OP и, следовательно, не обязательно полезны другим людям. OTOH Я полагаю, что этот вопрос в целом может быть неприменим ко многим другим, и поэтому его можно рассматривать как «помогите мне исправить этот код», и в этом случае они будут частью ответа ...





input - это указатель на непрозрачный тип FILE, а не указатель на содержимое файла, как вы, кажется, предполагаете. Это означает, что вы не можете напрямую получить доступ к содержимому файла через указатель. Вместо этого вам нужно передать input функциям, считывающим ввод из файла, таким как fgets, getc и fscanf.
Вы вообще не читаете из файла. Этот:
currentChar = input;
Назначает адрес объекта FILE, на который указывает input, для currentChar. Это также несоответствие типов, потому что вы назначаете FILE * на char *. Вы также не можете использовать strlen на input, потому что это не char *. Вы должны были получить множество предупреждений компилятора об этом.
Чтобы прочитать символы из файла, используйте функцию fgetc:
int currentChar = fgetc(input);
//while the current character isn't the last character of the input file or a ';'
while (currentChar != EOF && currentChar != ';')
currentString[i] = currentChar;
printf("%c", currentChar);
currentChar = fgetc(input);
i++;
}
Спасибо! Это огромная экономия! 2 вопроса: 1. Почему currentChar имеет тип int? 2. как fgetc узнает последний возвращенный символ и каждый раз возвращает следующий?
Чтобы получить доступ к файлу "input.txt" таким образом, вы должны его карта памяти. В противном случае вам придется использовать
fgetc(), чтобы читать его char за char.