У меня проблема, я не могу сказать, что делать. У меня есть задача, которая просит меня взять слова из файла (скажем, 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);
}`
Надеюсь, я не нарушил ни одного правила, потому что я еще новичок на этом сайте, спасибо всем!
Да, вы нарушили правило. Не связывайте свой код.
Найдите время, чтобы прочитать страницы помощи, особенно разделы с названиями "Какие темы я могу спросить здесь?" и «Каких типов вопросов мне следует избегать?». Также пожалуйста взять тур и читай о том, как задавать хорошие вопросы. Наконец, узнайте, как создать Минимальный, полный и проверяемый пример.
Я не получаю первых двух комментариев, они кажутся мне противоречащими. Я не публиковал его без ссылки, потому что, даже если это не самый длинный код, который когда-либо был написан, это все равно довольно длинная часть, и я подумал, что будет плохо видеть. Думаю, я отредактирую ту часть, которая, по моему мнению, имеет значение .. @Someprogrammerdude спасибо за ссылки, я прочитаю их как можно скорее
Цель кода MVCE состоит в том, чтобы мы могли скопировать / вставить ваш код и самостоятельно увидеть, что происходит. Не думаю, что смогу скомпилировать ваш код ... Кроме того, в вашем алгоритме есть изъян: что произойдет, если в индексе 1022 есть слово «проблема»? первые fgets будут иметь «pr», и вы напишете «rp» в файле outpout, а вторые fgets будут иметь «oblem», и вы напишете «melbo», получив в итоге «rpmelbo» вместо «melborp».
Так я должен опубликовать весь код? Это как-то странно. В любом случае, это все предположения, которые дал нам наш учитель, строка не будет длиннее, поэтому я использую ограниченное чтение. Я забыл упомянуть об этом в начале, особенно потому, что я разместил ссылку pastebin со всем кодом, но, похоже, я не могу: / Если вам интересно, fp = input и fo = output, плюс мне пришлось использовать strtok и fgets
Вы должны опубликовать минимальный код, потому что, когда вы «удалите» ненужную часть кода, чтобы сделать минимальную, вы можете волшебным образом заставить свою программу «работать», и это может привести к решению. Кстати, ваш код pastebin можно считать минимальным.
Что ж, я полагаю, что той части, которую я поставил, достаточно, потому что остальная часть программы буквально просто тестирует Я нахожусь в предположениях, которые моя задача попросила меня, чтобы я был (argc = 3 или argc = 4, проверяя этот входной файл присутствует и прочее). После этого просто обычный fclose (fo & fp) aa и все. В любом случае, я должен указать, что strrev отсутствует в Linux, насколько мне известно, поэтому я переопределил его, просто скопировав последний символ строки в первый и наоборот. Неужели это так?
какую часть «мы должны иметь возможность скопировать / вставить ваш код и скомпилировать его» вы пропустили ???? stackoverflow.com/help/mcve





Кажется, с вашим кодом проблем нет.
Можете ли вы проверить это и сказать, возникла ли ваша проблема снова?
#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 дня подряд, и я схожу с ума :(
Двойной клик ? Какая программа открывает ваш файл результатов? Потому что, если ваш файл считается исполняемым, я думаю, это может быть ошибкой. Особенно, если вы можете открыть файл с помощью gedit как шарм.
Я готов сделать снимок экрана, если понадобится, в любом случае там написано «Коврик для мыши». Тот же «Коврик для мыши» может без проблем открыть файл «input.txt».
Ждать. Я только что понял. Проблема в том, что он пытается открыть его с опцией «Система (UTF-8)». Если я удалю слово «è» из файла input.txt (это слово «is» на итальянском языке), я наконец смогу открыть его даже двойным щелчком. Вау .. В любом случае, спасибо, ты заставил меня это понять!
Так что проблема в коврике для мыши, а не в вашем коде. Рад за вас, что эти 3 дня страданий подошли к концу. Удачи !
Разместите код вместе со своим вопросом вместо ссылки на него.