Проблемы с созданием заглавной копии ранее существовавшего файла

#c #capitalization #visual-studio-2022 #data-files

#c #капитализация #visual-studio-2022 #файлы данных

Вопрос:

Итак, на данный момент я пытаюсь создать программу, которая печатает существующие данные текстового файла и копирует эти данные во всех заглавных буквах. Я могу открыть исходный текстовый файл и могу скопировать его в обычном смысле без заглавных букв; однако, когда я пытаюсь заставить программу написать исходное сообщение с заглавной буквы, она просто…не хочет этого делать. Он либо может работать, но вообще не печатает текст, либо просто ограничивает меня в этом. Есть ли что-то, чего мне не хватает, чтобы я мог исправить этот код, чтобы он функционировал должным образом?

 #define _CRT_SECURE_NO_WARNINGS #include lt;stdio.hgt; #include lt;stdlib.hgt; /* Required for Exit */ #include lt;ctype.hgt; /* Required for the character function library */  int main() {   /* Limitations in characters */  FILE* inFile;  FILE* outFile;  char line[100];  char lineTwo;  char fileCreate[100], charman; /* Variables for Function */   printf("Hello there user!n "); /* Introductory to the User */  printf("This program is set to print out the contents of a very specific file in caps.n");  printf("Afterwards you will be prompted for a name to the output file.n");   inFile = fopen("C:\privacyisvalued\insertname.txt", "r"); /* Read the file's contents */  /* Keep in mind, file location may differ */  if (inFile == NULL) /* Test for Errors */   {   printf("nFile unavailable.");  printf("nThe program will now exit.");  exit(1);  }   while (fgets(line, 100, inFile) != NULL) /* Read the file */  {   printf("n%s", line);  }   printf("nPlease write the name of the file that you'd like to create in text format: ");   scanf("%s", fileCreate); /* User Input */     outFile = fopen(fileCreate, "w");  if (outFile == NULL) {  printf("nFile unavailable.");  printf("nThe program will now exit.");  exit(1);  }  while((lineTwo = fgetc(inFile)) != EOF)  {   line = toupper(line);  fputs(line, outFile);  }  return 0;  }  

Комментарии:

1. Вы открыли файл и получили из него все содержимое. Вам, пожирателю, придется закрыть и открыть его снова или вернуть курсор в начало файла, чтобы снова прочитать его.

2. Обратите внимание, что это не так, как toupper используется. Включите предупреждения компилятора или прочитайте их. line представляет собой массив из 100 символов. Функция toupper работает с одним символом (и возвращает его). Возможно, вы имели в виду fputc(toupper(lineTwo), outFile);

3. Ну, и куда мне следует поместить подобную функцию? Должно ли это входить в оператор if или должно выходить за его пределы?

4. Первый комментарий касается того факта, что вы открыли файл, а затем прочитали из него данные. Поэтому, если вы продолжите чтение данных, оно начнется с того места, на котором остановилось предыдущее чтение. Если у вас нет причин для этого первоначального fgets вызова (например, если вам не нужно читать и отображать исходное содержимое), вы можете просто удалить его. В противном случае, как было предложено, вам следует вернуться к началу файла перед повторным чтением: fseek(inFile, 0, SEEK_SET);

5. В качестве альтернативы, если вы просто хотите прописать и вывести содержимое line , которое было прочитано ранее, сделайте это вместо этого: for (const char* s = line; *s; s) fputc(toupper(*s), outFile); — нет необходимости вводить этот цикл ввода файла, если только вы не намерены выводить только данные, которые появляются после верхней строки этого файла.