fprintf 练习工作但 txt 在 运行 后无效

fprintf exercise working but the txt is not valid after running

我遇到了一个问题,我不知道该怎么做。我有这个任务要求我从一个文件中取出单词(比方说 input.txt)并以相反的顺序将它们全部写入另一个文件(比方说 output.txt)。有趣的是,当我执行我的程序时(我有我大学给我的 Xubuntu 虚拟机)无法双击 output.txt 文件,因为出了点问题:我会尝试翻译它: "Byte sequence invalid in the conversion's input"

有趣的是,如果我这样做 "gedit output.txt" 我确实看到这些词都写得很好,所以我会说我的程序 "works but corrupts the file"。这背后的理论原因是什么?如果你想帮我指出它们,这里有一个 link 到我的代码 [编辑,看来我不能 post pastebin link。这是涉及输出文件的部分]:

    `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);
     }` 

我希望我没有违反任何规则,因为我还是这个网站的新手,谢谢大家!

看来你的代码本身没有问题。

你能测试一下,看看你的问题是否又来了吗?

#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;
}

你能编译 & 运行 这段代码并说明 "mousepad" 是否还在迷失自我吗?

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;
}