8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

字符信息保存为奇怪的字母

frfernandezdev 2月前

97 0

我正在尝试编写可以在 .txt 文档中插入、查阅和删除任何信息的代码,但是当我在 C 控制台上插入信息时,每条信息都保存为奇怪的字母和符号......

我正在尝试编写可以插入、查阅和删除文档中任何信息的代码 .txt ,但是当我在 C 控制台上插入信息时,每条信息都保存为这样的奇怪的字母和符号:

                        Q(@     `$@     1       P            ÿÿÿÿÿÿÿÿ1           
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Dados
{
    char ID[2];
    char NOME[50];
    char EMAIL[50];
    char TELEFONE[14];
    char STATUS[1]; 
} Dados;

Dados GetDados()
{
    Dados dados;
    system("cls");
    printf("\n\nDigite o ID: ");
    scanf("%s", dados.ID);
    
    printf("\n\nDigite seu primeiro nome: ");
    scanf("%s", dados.NOME);
    
    printf("\n\nDigite o Email: ");
    scanf("%s", dados.EMAIL);
    
    printf("\n\nDigite o Telefone: ");
    scanf("%s", dados.TELEFONE);
    
    rewind(stdin);
    return dados;
}


void ConsultarPorID(char ID[]) {
    FILE * arq;
    Dados dados;
    int encontrou = 0;

if ((arq = fopen("c:\\pastadados\\newdados.txt", "r")) == NULL) {
    printf("Erro ao abrir o arquivo.\n");
    return;
}
while (fscanf(arq, "%s%s%s%s", dados.ID, dados.NOME, dados.EMAIL, dados.TELEFONE) != EOF) {
    if (strcmp(dados.ID, ID) == 0) {
        printf("\n\tId: %s\n", dados.ID);
        printf("\tNome: %s\n", dados.NOME);
        printf("\tEmail: %s\n", dados.EMAIL);
        printf("\tTelefone: %s\n", dados.TELEFONE);
        encontrou = 1;
    }
}
if (!encontrou) {
    printf("Nenhum rsegistro encontrado com o ID '%s'.\n", ID);
}
fclose(arq);
}


int main()
{
    FILE * arq;
    Dados dados;
    char ID[2];
    char NOME[50];
    char EMAIL[50];
    char TELEFONE[14];
    char STATUS[1];
    int resposta, idConsulta;
    
    printf("\n1 - Inserir dados\n\n2 - Consultar por ID\n\n3 - Consultar por nome\n\n4 - Consultar por email\n\n5 - Consultar por telefone\n\n6 - Excluir dados\n\n\nQue opcao deseja prosseguir? ");
    scanf("%d", &resposta);
    
    if(resposta == 1)
    {
        if ((arq = fopen("c:\\pastadados\\newdados.txt", "a")) == NULL)
        {
            printf("\n\nNao foi possivel criar o arquivo! :(\n\n");
            exit(1);
        }
        else 
        {
            do {
                GetDados();
                fwrite(&dados, sizeof(Dados), 1, arq);
                printf("\n\nDados salvos com sucesso!\n");
                printf("\nDeseja inseir mais dados? (s/n): ");
                resposta = getche();
            } while (resposta != 'n' && resposta != 'N');
            fclose(arq);
        }
    }

    else if (resposta == 2) {
        system("cls");
        printf("Digite o ID que deseja consultar: ");
        scanf("%d", &idConsulta);
        
        fgets(ID, 2, stdin);
        ID[strcspn(ID, "\n")]; 
        
        ConsultarPorID(ID);
    }
    
    else if (resposta == 6) {
        remove("c:\\pastadados\\newdados.txt");
        printf("\nDados excluidos com sucesso!");
    }
    return 0;
}

    

我不知道,也许这个错误是在 Char 字符串中

帖子版权声明 1、本帖标题:字符信息保存为奇怪的字母
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由frfernandezdev在本站《file》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我似乎在文件选择器对话框的非常简单的实现中遇到了问题,每次都需要我最小化 Netbeans 才能访问它,这让人非常沮丧,特别是……

    我似乎在对文件选择器对话框进行非常简单的实现时遇到了问题,每次都需要我最小化 Netbeans 才能访问它,这让人非常沮丧,特别是现在进行测试时。

    我在网上看到了一些解决方案,包括 SO ,但似乎都没有解决问题,而其他一些解决方案对于我目前的水平来说似乎非常冗长和复杂。

    private void fileSearch() {
    
        JFileChooser fileSelect = new JFileChooser();
        int returnVal = fileSelect.showOpenDialog(null);
        String pathToFile;
    
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = fileSelect.getSelectedFile();
            pathToFile = file.getAbsolutePath();
            try {
                P.binaryFileToHexString(pathToFile);
            } catch (Exception e) {
                System.out.print("Oops! there was an error there..." + e);
            }
            System.out.println("\nYou chose to open this file: " + file.getName());
        }
    }
    

    我的一些尝试包括使用;

    .requestFocus();
    .requestFocusInWindow();
    .setVisible();
    

    是否有我可以设置的特定属性/方法来解决该问题?

  • 您不应该做任何这些事情。我想知道这是否是代码中其他地方的原因。例如,您是否将 AWT 组件与 Swing 组件混合在一起?

  • 其实不是,这是整个程序中唯一使用 UI 的方法,其余的仍然是纯控制台。关于导入,我只使用

  • 我会将文件 A 从 cli 复制到文件 B,就像 gforth script.fs -- 文件 A 文件 B 一样,'--' 似乎是强制性的,以使 gforth 尝试将其作为附加 forth 代码官方文档考试加载……

    我会从 cli 复制文件 A 到文件 B,就像

    gforth script.fs -- fileA fileB
    

    '--' 似乎是强制的,以使 gforth 无效,试图将其加载为附加的 forth 代码

    官方文件示例说

    0 Value fd-in
    0 Value fd-out
    : open-input ( addr u -- )  r/o open-file throw to fd-in ;
    : open-output ( addr u -- )  w/o create-file throw to fd-out ;
    
    s" foo.in" open-input
    s" foo.out" open-output
    
    : copy-file ( -- )
      begin
          line-buffer max-line fd-in read-line throw
      while
          line-buffer swap fd-out write-line throw
      repeat ;
    
    
    but I would get filenames from CLI
    
    so I tryied many things around 
    
    \ Define buffer size for filenames and IO operations
    256 Constant filename-len
    4096 Constant io-buffer-len
    
    \ Allocate buffers for filenames
    Create source-filename filename-len allot
    Create dest-filename filename-len allot
    Create io-buffer io-buffer-len allot
    
    \ Variables to store file IDs
    Variable source-file-id
    Variable dest-file-id
    
    \ Define a word to calculate the length of a string up to a maximum length
    : str-len ( c-addr max-len -- n )
      0 swap  ( n c-addr )
      begin  dup 1+  ( n c-addr+1 )
             over + c@  ( n c-addr+1 c-addr+1[i] )
             while  1+  ( n+1 )
      repeat  drop ;
    
    \ Safely store command-line arguments into buffers
    : safe-store ( addr len arg# -- )
      arg swap  ( c-addr u arg# )
      2dup >r str-len r> min  ( c-addr u n )
      move ;
    
    : store-filenames
      \ Store first filename, ensure it doesn't exceed buffer size
      source-filename filename-len 1 safe-store
      \ Store second filename, ensure it doesn't exceed buffer size
      dest-filename filename-len 2 safe-store ;
    
    \ Open the source file for reading
    : open-source-file
      source-filename filename-len s" r" open-file throw source-file-id ! ;
    
    \ Open the destination file for writing (create if not exists)
    : open-dest-file
      dest-filename filename-len s" w" open-file throw dest-file-id ! ;
    
    \ Copy content from the source file to the destination file
    : copy-file
      begin
        source-file-id @ io-buffer io-buffer-len read-file throw
      while
        io-buffer swap dest-file-id @ write-file throw
      repeat ;
    
    \ Close the files
    : close-files
      source-file-id @ close-file throw
      dest-file-id @ close-file throw ;
    
    \ Main routine
    : main
      store-filenames
      open-source-file
      open-dest-file
      copy-file
      close-files ;
    
    \ Execute the main routine
    main
    

    先前版本是

    4194304 Constant max-line
    256 constant filename-size
    Create line-buffer max-line 2 + allot
    create filename-input filename-size allot
    create filename-ouput filename-size allot
    \ filename 
    variable input-file-id
    variable output-file-id
    \ close files buffers
    : cleaning
        input-file-id close-file throw 
        output-file-id close-file throw 
        cr 0 (bye)
    ;
    \ create buffers for data treatment
    : initiating
        filename-input count r/o open-file throw input-file-id !
        filename-ouput w/o create-file throw output-file-id !
    ;
    \ read filenames from cli arguments
    : getparemters
        1 arg filename-input swap move
        2 arg filename-ouput swap move
    ; 
    \ copy file 
    : copying
        begin
            line-buffer max-line input-file-id read-line throw
        while
            line-buffer swap output-file-id write-line throw
        repeat
    ;
    \ main code
    : main
        getparemters
        initiating
        copying
        cleaning
    ;
    main 
    

    但我总是无法管理文件名捕获,从而产生内存错误或其他类型的错误

    我对此感到困惑

  • 终于找到解决方法

    naw 代码是

    65535 constant maxline
    \ buffer
    create linebuffer maxline 2 + allot
    \ filenames
    2variable   filenameinput
    2variable   filenameouput
    \ file ids
    0 value     inputfileid
    0 value     outputfileid
    \ close files buffers
    : COLORIZE 27 EMIT ." [" base @ >R 0 <# #S #> type R> base ! ." m"  ; \ ASCII TERMINAL ONLY 
    : cleaning
        inputfileid close-file throw 
        outputfileid close-file throw 
        0 (bye)
    ;
    \ create buffers for data treatment
    : initiating
        filenameinput 2@ r/o open-file throw to inputfileid 
        filenameouput 2@ r/w create-file throw to outputfileid
    ;
    \ read filenames from cli arguments
    : getparemters
        argc @ 3 <> if 
            \ manage bad parameter number
            cr cr 91 colorize   
            0 arg type ."  thisprogram.fs filename destinationfilename"
            0 colorize cr cr cr 
            1 (bye)
        else
            \ get filenames
            1 arg filenameinput 2!
            2 arg filenameouput 2!
        then
    ; 
    \ copy file 
    : copying
        begin
            \ line buffer read
            linebuffer maxline inputfileid read-line throw
        while
            \ line buffer copy
            linebuffer swap outputfileid write-line throw
        repeat
    ;
    \ main code
    : main
        getparemters
        initiating
        copying
        cleaning
    ;
    main 
    

    这对于任何 ascii 文件都适用

  • 的 API showOpenDialog() 引用 showDialog() ,其含义是,“如果父级是 null ,则对话框不依赖于任何可见窗口,并且它被放置在与外观相关的位置,例如屏幕的中心”。

    下面的示例将选择器置于我的 L&F 屏幕的中心。您可能会看到它与您的相比如何。

    package gui;
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.KeyStroke;
    
    /**
     * @see http://.com/questions/8507521
     * @see http://.com/questions/5129294
     */
    public class ImageApp extends JPanel {
    
        private static final int MASK =
            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
        private JFileChooser chooser = new JFileChooser();
        private Action openAction = new ImageOpenAction("Open");
        private Action clearAction = new ClearAction("Clear");
        private JPopupMenu popup = new JPopupMenu();
        private BufferedImage image;
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new ImageApp().create();
                }
            });
        }
    
        public void create() {
            JFrame f = new JFrame();
            f.setTitle("Title");
            f.add(new JScrollPane(this), BorderLayout.CENTER);
            JMenuBar menuBar = new JMenuBar();
            JMenu menu = new JMenu("File");
            menu.setMnemonic('F');
            menu.add(new JMenuItem(openAction));
            menu.add(new JMenuItem(clearAction));
            menuBar.add(menu);
            f.setJMenuBar(menuBar);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.pack();
            f.setSize(new Dimension(640, 480));
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public ImageApp() {
            this.setComponentPopupMenu(popup);
            popup.add("Popup Menu");
            popup.add(new JMenuItem(openAction));
            popup.add(new JMenuItem(clearAction));
        }
    
        @Override
        public Dimension getPreferredSize() {
            if (image == null) {
                return new Dimension();
            } else {
                return new Dimension(image.getWidth(), image.getHeight());
            }
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, null);
        }
    
        private class ClearAction extends AbstractAction {
    
            public ClearAction(String name) {
                super(name);
                this.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_C);
                this.putValue(Action.ACCELERATOR_KEY,
                    KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK));
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                image = null;
                revalidate();
                repaint();
            }
        }
    
        private class ImageOpenAction extends AbstractAction {
    
            public ImageOpenAction(String name) {
                super(name);
                this.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_O);
                this.putValue(Action.ACCELERATOR_KEY,
                    KeyStroke.getKeyStroke(KeyEvent.VK_O, MASK));
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                int returnVal = chooser.showOpenDialog(chooser);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File f = chooser.getSelectedFile();
                    try {
                        image = ImageIO.read(f);
                        revalidate();
                        repaint();
                    } catch (IOException ex) {
                        ex.printStackTrace(System.err);
                    }
                }
            }
        }
    }
    
  • 我感谢你的努力和帮助 trashgod。但是就像我之前说的,其他一些(解决方案)对于我目前的水平来说似乎非常冗长和复杂。起初我以为这是我这边的一个直接错误,但现在我意识到它比我想象的要复杂一些,而且由于它不是必须的,因此它只会在我的测试过程中对我有益,我想我现在会把它放在一边,专注于功能。再次感谢,当时间不是限制因素时,我一定会尝试你的建议。

  • 没问题;我已相应简化了示例。早期版本仍可访问:.com/posts/5129757/revisions

  • 我不确定你的问题实际上是什么(可能是你的 Netbeans......谁知道呢),但是你尝试过覆盖该 createDialog 方法吗?

    例子:

    JFileChooser fc = new JFileChooser() {
       @Override
       protected JDialog createDialog(Component parent) throws HeadlessException {
           // intercept the dialog created by JFileChooser
           JDialog dialog = super.createDialog(parent);
           dialog.setModal(true);  // set modality (or setModalityType)
           return dialog;
       }
    };
    

    这仅仅是一个黑客解决方案,通常您不需要这样做。

  • DKY 2月前 0 只看Ta
    引用 11

    nop 也没有起到作用,我开始认为是 netbeans 造成了这个问题。不过还是谢谢你

  • 当我将应用程序(JFrame)传递到超级构造函数而不是传递“parent”时,此解决方案对我有用。谢谢!

  • fileSelect.showOpenDialog(this)
    

    当然, this 必须是某种类型的组件(主界面的 JFrame 或 JPanel)。如果希望它们位于最前面,则所有对话框都需要有一个父组件。

  • 你写道(在你的 comment ):

    实际上不是,这是整个程序中唯一使用 UI 的方法,其余的仍然是纯控制台。

    换句话说,您想向 控制台应用程序 ,而您的问题是 JFileChooser 没有成为活动窗口,即具有 键盘焦点 .

    另一个答案 所述 ,问题在于您将 JFileChooser [打开] 对话框的父级设置为空。

    下面的代码创建了一个最小的对话框 JFrame ,它既是 JFileChooser 对话框的父级,也是 顶层容器 。在下面的代码中,通过控制台询问用户是否要选择一个文件。如果答案是 , Y JFileChooser 显示对话框。关闭该对话框后,再次询问用户是否要选择一个文件。因此,我理解,您想要实现的是一个带有 GUI 组件的控制台应用程序。

    (代码后的注释。)

    import java.io.File;
    import java.util.Scanner;
    
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    
    public class SlctFile {
    
        private static void fileSearch() {
            JFrame frame = new JFrame();
            frame.setAlwaysOnTop(true);
            frame.setVisible(true);
            JFileChooser fileSelect = new JFileChooser();
            int returnVal = fileSelect.showOpenDialog(frame);
            String pathToFile;
    
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fileSelect.getSelectedFile();
                pathToFile = file.getAbsolutePath();
                try {
                    P.binaryFileToHexString(pathToFile);
                }
                catch (Exception e) {
                    System.out.print("Oops! there was an error there..." + e);
                }
                System.out.println("\nYou chose to open this file: " + file.getName());
            }
            frame.dispose();
        }
    
        public static void main(String[] args) {
            String answer;
            Scanner stdin = new Scanner(System.in);
            do {
                System.out.print("Select file? ");
                answer = stdin.nextLine();
                if ("Y".equalsIgnoreCase(answer)) {
                    fileSearch();
                }
            } while ("Y".equalsIgnoreCase(answer));
            System.exit(0);
        }
    }
    
    • 方法 setAlwaysOnTop 确保将 JFrame 成为活动窗口。
    • 一旦 JFrame 显示 ,就 JFileChooser 立即显示 。
    • 调用方法 exit 是必需的,因为显示 JFrame 会启动 事件分派线程 (EDT)。当主线程终止时,EDT 不会终止,因此调用方法 exit 可确保 JVM 终止。
  • 我目前有一个类层次结构,可以归结为:class A{ int m_A = 1; public: voidassign(const A& other) { m_A = other.m_A; }};class B : public A...

    我目前有一个类层次结构,可以归结为 以下内容 :

    class A
    {
        int m_A = 1;
     public:
        void assign(const A& other)
           {
            m_A = other.m_A;
           }
    };
    
    class B : public A
    {
        int m_B = 2;
     public:
        void assign(const B& other)
           {
            A::assign(other);
            m_B = other.m_B;
           }
    };
    
    class C : public B
    {
        int m_C = 3;
     public:
        void assign(const C& other)
           {
            B::assign(other);
            m_C = other.m_C;
           }
    };
    //... and so on
    

    该成员函数 assign() 复制(...)同一类型的另一个实例的内容。

    在子类中实现,或者在实现中忘记调用父类的函数 assign() ,那么 程序(默默地)就是不正确的::assign() :

    class Berr1 : public A
    {
        int m_Berr1 = 2;
     public:
        //void assign(const Berr1& other) // Oops!
    };
    
    class Berr2 : public A
    {
        int m_Berr2 = 2;
     public:
        void assign(const Berr2& other)
           {
            //A::assign(other); // Oops!
            //...
           }
    };
    

    这非常脆弱,我想知道是否有一种技术可以保证继承自的子类 A 实现成员函数 assign() ,观察:

    • 成员 assign() 函数没有相同的原型。将父对象(例如 A )分配给子对象(例如 B )是错误的,必然会导致编译错误。
    • 我并不排除 CRTP (奇怪的循环模板模式),但我对替代技术更感兴趣(如果存在的话)
  • 我正在尝试重构一些代码以减少代码重复。目前我有一个服务,它采用自己的自定义 Payload 类并返回自己的 Response 类。目前它还没有...

    我正在尝试重构一些代码以减少代码重复。目前我有一个服务,它采用自己的自定义 Payload 类并返回自己的 Response 类。目前,执行此操作的服务类不止一个,而是大约 5 或 6 个。因此, 尽管方法主体实际上是相同的,只是返回类型不同,但这 大量

    例如:

    public class ServiceA {
        ResponseA getResponse(PayloadA){...}
    }
    public class ServiceB {
        ResponseB getResponse(PayloadB){...}
    }
    public class ServiceC {
        ResponseC getResponse(PayloadC){...}
    }
    

    方法主体逐字逐句都相同,但因为它是使用 WebClient 的发布请求,并且方法以 结尾 ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(response, new TypeReference<>() {}); ,所以我们只是一遍又一遍地复制该方法。

    我试图实现一个名为 RestService 的抽象超类,并且有两个名为 RestResponse 和 RestPayload 的空接口,每个服务都可以自行实现,但是如何让服务类返回它自己的 Response 类型而不是仅仅是一个空接口的 RestResponse 类型?


    编辑-更新:因此,在有些相关的说明中,我通过执行以下操作解决了我的问题:

    public abstract class ParentService<R extends IResponse, P extends IPayload>{
      public abstract R getPayload(P);
    }
    
    public class ServiceA extends ParentService<ResponseA, PayloadA> {
      @Override
      public ResponseA getPayload(PayloadA){
        /***/
        ObjectMapper mapper = new ObjectMapper();     
        return mapper.readValue(response, new TypeReference<>() {});
      }
    }
    

    其中每个附加服务都类似地继承。并且每个响应和有效负载分别实现 IResponse 和 IPayload 接口模型。

    谢谢你的建议!

    (最终的设计决策基于当前接受的答案、有关 Java 中的泛型和抽象类的附加阅读以及代码库设计决策)

  • 我没有足够的信息来回答,A、B、C 类型的有效载荷和响应之间有什么区别?除非我们了解所有这些类别的定义,否则不可能回答

  • 就是这样,它们根本没有任何共同的字段,唯一的共同点是它们都是从 getResponse 方法返回的。Response 类也是类似的,由于我无法深入探究的原因,这一点无法改变。

  • 引用 19

    您永远不必创建 \'assign\' 函数。复制构造函数和复制赋值运算符已经负责此操作。而对于您而言,默认函数已经可以完成此工作,您无需执行任何操作,只需删除所有分配函数即可 :D

  • 这样的事情对你有用吗?

    • T 将返回方法调用者想要的类型。
    • 有效载荷可以是任何类型
    public class GeneralService {
        public <T> T getResponse(Object payload, Class<T> clazz){
            // do sth with payload
            return mapper.readValue(response, clazz);
        }
    }
    

    如果您希望能够反序列化集合,则可以 TypeReference 使用 Class

    public class GeneralService {
        public <T> T getResponse(Object payload, TypeReference<T> type){
            // do sth with payload
            return mapper.readValue(response, type);
        }
    }
    

    然后使用类型调用它,例如字符串列表:

    generalService.getResponse(payload, new TypeReference<List<String>>(){})
    
返回
作者最近主题: