Открытие файлов в C

Полное редактирование:

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

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{
char letter;
FILE *fp;
fp=fopen("‪‪‪C:\\Users\\LENOVO\\Desktop\\data.txt","r");
if(fp==NULL)
{
    printf("error");
    getch();
    exit(1);
}

while(fscanf(fp,"%d",&letter)!=EOF)
putchar(letter);
getch();
fclose(fp);
}‪

Изображение пути: https://imgur.com/a/YwFYy

Все еще печатает ошибку

3 ответа

Чтобы прочитать все из текстового файла и сохранить его содержимое в буфере:

Во-первых, вы должны посчитать, сколько символов в текстовом файле:

size_t get_file_len(FILE *fp)
{
    size_t num = 0;

    while (fgetc(fp) != EOF)
        num++;

    return (fseek(fp, 0, SEEK_SET) == 0 ? num : 0);
}

Затем выделите память для достаточно большого буфера и прочитайте все символы:

char *load_text(const char *path)
{
    char *buf = NULL;
    FILE *fp = NULL;
    size_t num = 0;
    size_t i = 0;
    int c = 0;

   /* open the file in text mode */
   fp = fopen(path, "r");
   if (!fp)
       return NULL;

   /* if the file was empty or if an error occurred, return error */
   if ((num = get_file_len(fp)) == 0) {
       fclose(fp);

       return NULL;
   }

   buf = malloc(num + 1);
   if (!buf) {
       fclose(fp);

       return NULL;
   }

   while ((c = fgetc(fp)) != EOF)
       buf[i++] = (char)c;

   /* ensure that the string is null-terminated */
   buf[i] = '\0';

   fclose(fp);

   return buf;
}

Кроме того, в C все escape-последовательности начинаются с '\' (обратная косая черта), поэтому, если вы хотите написать обратную косую черту в строку или символ, вы должны записать ее как '\\' (двойная обратная косая черта):

input=fopen("‪C:\\Users\\LENOVO\\Desktop\\data.txt","r");

Хорошо, во-первых, давайте посмотрим на ваш путь к файлу. Есть два способа получить доступ к файлу из вашего локального хранилища:

относительные адреса, если файл имеет ту же корневую папку, что и ваше приложение

абсолютные адреса, если файл находится в определенном месте в памяти вашего компьютера

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

Я бы предложил использовать это вместо (двойная косая черта)

input=fopen("‪C:\\Users\\LENOVO\\Desktop\\data.txt","r");

Это предотвратит интерпретацию форматирования строки.

Во-вторых, EOF - это просто предопределенная макрос-константа, и я думаю, что она равна -1, поэтому ваш код while(! (-1)) не очень хорошая идея для чтения до конца файла.

Чтобы читать из файла, пока вы не достигнете его конца, я бы рассмотрел это свойство fscanf ():fscanf () возвращает EOF, когда он достигает конца файла.

while(fscanf(input,"%ch",&letter) != EOF) {
putchar(letter);
}

Этот способ чтения из файла должен делать свою работу.

Довольно просто здесь:

    while(!feof(input)){
    fscanf(input,"%c",&letter);
    putchar(letter);
    }

и не забудьте закрыть файл, используя fclose(input);

Другие вопросы по тегам