Упражнение fprintf работает, но текст после запуска недействителен

У меня проблема, я не могу сказать, что делать. У меня есть задача, которая просит меня взять слова из файла (скажем, input.txt) и записать их все в другой файл (скажем, output.txt) в обратном порядке. Самое интересное то, что когда я выполняю свою программу (у меня есть виртуальная машина Xubuntu, предоставленная мне из моего университета), невозможно дважды щелкнуть файл output.txt, потому что что-то не так: я попытаюсь перевести его: «Последовательность байтов недопустима во входных данных преобразования»

Самое интересное, что если я использую "gedit output.txt", я вижу, что все эти слова хорошо написаны так, как они должны быть, поэтому я бы сказал, что моя программа "работает, но портит файл". Какие могут быть теоретические причины этого? И если вы хотите помочь мне указать их, вот ссылка на мой код [ИЗМЕНИТЬ, кажется, я не могу опубликовать ссылку pastebin. Вот часть, которая включает выходной файл]:

    `char *t=malloc(sizeof(char)*1025), *tmp;
     t=fgets(t,1024,fp);

     while(t!=NULL){
         tmp=strtok(t, " ");
         while(tmp!=NULL){  
             tmp=strrev(tmp);
             fprintf(fo, " %s", tmp);
             tmp=strtok(NULL, " ");
         }
     t=fgets(t,1024,fp);
     }` 

Надеюсь, я не нарушил ни одного правила, потому что я еще новичок на этом сайте, спасибо всем!

Разместите код вместе со своим вопросом вместо ссылки на него.

J...S 09.03.2018 17:59

Да, вы нарушили правило. Не связывайте свой код.

Fred Larson 09.03.2018 17:59

Найдите время, чтобы прочитать страницы помощи, особенно разделы с названиями "Какие темы я могу спросить здесь?" и «Каких типов вопросов мне следует избегать?». Также пожалуйста взять тур и читай о том, как задавать хорошие вопросы. Наконец, узнайте, как создать Минимальный, полный и проверяемый пример.

Some programmer dude 09.03.2018 17:59

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

Giuliolio93 09.03.2018 18:06

Цель кода MVCE состоит в том, чтобы мы могли скопировать / вставить ваш код и самостоятельно увидеть, что происходит. Не думаю, что смогу скомпилировать ваш код ... Кроме того, в вашем алгоритме есть изъян: что произойдет, если в индексе 1022 есть слово «проблема»? первые fgets будут иметь «pr», и вы напишете «rp» в файле outpout, а вторые fgets будут иметь «oblem», и вы напишете «melbo», получив в итоге «rpmelbo» вместо «melborp».

Tom's 09.03.2018 18:17

Так я должен опубликовать весь код? Это как-то странно. В любом случае, это все предположения, которые дал нам наш учитель, строка не будет длиннее, поэтому я использую ограниченное чтение. Я забыл упомянуть об этом в начале, особенно потому, что я разместил ссылку pastebin со всем кодом, но, похоже, я не могу: / Если вам интересно, fp = input и fo = output, плюс мне пришлось использовать strtok и fgets

Giuliolio93 09.03.2018 18:25

Вы должны опубликовать минимальный код, потому что, когда вы «удалите» ненужную часть кода, чтобы сделать минимальную, вы можете волшебным образом заставить свою программу «работать», и это может привести к решению. Кстати, ваш код pastebin можно считать минимальным.

Tom's 09.03.2018 18:27

Что ж, я полагаю, что той части, которую я поставил, достаточно, потому что остальная часть программы буквально просто тестирует Я нахожусь в предположениях, которые моя задача попросила меня, чтобы я был (argc = 3 или argc = 4, проверяя этот входной файл присутствует и прочее). После этого просто обычный fclose (fo & fp) aa и все. В любом случае, я должен указать, что strrev отсутствует в Linux, насколько мне известно, поэтому я переопределил его, просто скопировав последний символ строки в первый и наоборот. Неужели это так?

Giuliolio93 09.03.2018 18:35

какую часть «мы должны иметь возможность скопировать / вставить ваш код и скомпилировать его» вы пропустили ???? stackoverflow.com/help/mcve

Tom's 09.03.2018 18:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, с вашим кодом проблем нет.

Можете ли вы проверить это и сказать, возникла ли ваша проблема снова?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *strrev(char *str)
{
    int i = 0;
    int j = strlen(str) - 1;

    while (i < j) {
        char tmp = str[i];
        str[i] = str[j];
        str[j] = tmp;
        ++i;
        --j;
    }
  return (str);
}

#define BUFFER_LEN 1024

int main(int argc, char* argv[])
{
    char line[BUFFER_LEN + 1];
    FILE *fp                  = NULL;
    FILE *fo                  = NULL;

    if (argc != 3 && argc != 4) {
        fprintf(stderr, "Devi usare 2 o 3 argomenti grz\n");
        return -1;
    }

    if (!(fp = fopen(argv[1],"r"))) { //argv1=input.txt
        fprintf(stderr, "Devi \n");
        return -1;
    }
    if (!(fo = fopen(argv[2], (argc == 4 && strcmp(argv[3],"a")) ? "a" : "w"))) {
        fprintf(stderr, " 3 argomenti grz\n");
        return -1;
    }

    while(fgets(line, BUFFER_LEN, fp)) {
        for (char *word = strtok(line, " "); word; word = strtok(NULL, " ")) {
            fprintf(fo, "%s ", strrev(word));
        }
    }

    fclose(fp);
    fclose(fo);
    return 0;
}

Можете ли вы скомпилировать и запустить этот код и сказать, теряется ли «коврик для мыши»?

int main(int argc, char* argv[])
{
    FILE *fo = NULL;

    if (argc != 3 && argc != 4) {
        fprintf(stderr, "Devi usare 2 o 3 argomenti grz\n");
        return -1;
    }

    if (!(fo = fopen(argv[2], "w"))) {
        fprintf(stderr, " 3 argomenti grz\n");
        return -1;
    }

    fprintf(fo, "test");


    fclose(fo);
    return 0;
}

Да, он по-прежнему говорит то же самое, когда я пытаюсь дважды щелкнуть файл output.txt. Но опять же, если я использую «gedit» для того же файла, который я не могу дважды щелкнуть, я могу увидеть все слова в правильном порядке. Любая идея? Потому что это было 3 дня подряд, и я схожу с ума :(

Giuliolio93 09.03.2018 18:42

Двойной клик ? Какая программа открывает ваш файл результатов? Потому что, если ваш файл считается исполняемым, я думаю, это может быть ошибкой. Особенно, если вы можете открыть файл с помощью gedit как шарм.

Tom's 09.03.2018 18:44

Я готов сделать снимок экрана, если понадобится, в любом случае там написано «Коврик для мыши». Тот же «Коврик для мыши» может без проблем открыть файл «input.txt».

Giuliolio93 09.03.2018 18:45

Ждать. Я только что понял. Проблема в том, что он пытается открыть его с опцией «Система (UTF-8)». Если я удалю слово «è» из файла input.txt (это слово «is» на итальянском языке), я наконец смогу открыть его даже двойным щелчком. Вау .. В любом случае, спасибо, ты заставил меня это понять!

Giuliolio93 09.03.2018 18:50

Так что проблема в коврике для мыши, а не в вашем коде. Рад за вас, что эти 3 дня страданий подошли к концу. Удачи !

Tom's 09.03.2018 18:52

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