2013-04-26 55 views
0

所以我在下面給出了這個C代碼。當我放置printf語句來測試輸入文件中的文本時,我發現我收到了一堆垃圾值,更具體地說,它們甚至不是字母或數字,我認爲它們是帶有問號的鑽石。我認爲這意味着它不會按照它應該的方式處理這些值。輸入文件有一點MIPS彙編代碼,但在這種情況下,它只是一個文本文件。我已經評論了我的程序的所有其他部分,並留下了這個小部分,但我仍然收到了不好的價值。我可能在這裏做錯了什麼?來自C輸入文件的垃圾值C

我用在控制檯上運行的程序的命令是:

./assembler -symbols adder.asm

Where ./assembler is the driver (argv[0]) 
     -symbols is a tag used  (argv[1]) 
     adder.asm is the input file (argv[2]) 

所以一旦打開,我應該能夠抓住文本出該文件的,據我所知,這個文件並不是問題,而是早期工作。

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

FILE *fp; 
FILE *fp_out; 

void main(int argc, char* argv[]) 
{ 
    int mode; 

    if (strcmp(argv[1], "-symbols") == 0) 
    { 
     fp = fopen(argv[2], "r"); 
     mode = 1; 
    } 
    else 
    { 
     fp = fopen(argv[1], "r"); 
     fp_out = fopen(argv[2], "w"); 
     mode = 2; 
    } 
} 
+0

爲什麼選擇C++標記?這是C. – 2013-04-26 14:48:01

+0

不是,在C中,它將是'int main'。 – 2013-04-26 14:48:58

+0

@DanielFischer就像在C++ – Angew 2013-04-26 14:49:26

回答

2

嘗試添加以下行的開口部分之後,並添加#include <errno.h>開頭。

printf("%p, %p, %d\n", fp, ftp_out, errno); 

如果fp爲空,則打開文件時出現問題。如果你沒有檢查返回值,你可以讀取一個錯誤的緩衝區。也許有一些權限問題(或其他)。另外如果errno != 0你有問題。用perror <num>查詢命令行中的errno值(或參見perror(3)函數)。

+0

好的謝謝你的建議!我會在幾分鐘內嘗試一下,並讓你知道我得到了什麼! – 2013-04-26 18:48:06

+0

除非fp或fp_out爲NULL,否則不需要打印任何內容,如果不是,則errno的值是未定義的,所以'errno!= 0'沒有意義。應該使用perror或strerror(errno),而不僅僅是打印出一個原始的errno。最後,我們甚至不知道OP是否讀過任何數據,或者如何打印,或者如何打印。 (我們也只有OP的單詞adder.asm包含文本;鑑於命令行如何被解析,文件可能已被視爲輸出文件並在某些時候被覆蓋。) – 2013-04-26 19:56:50

+0

@Jim Balter:你說的最對。實際上'errno'值永遠不會被定義,但它包含最後一個錯誤的值,或者如果沒有這樣的值,或者程序員設置它的值。如果prog檢查每個打開的返回值並打印錯誤(如果爲null),最好的方法是。但建議是本地化問題的第一步。 – TrueY 2013-04-27 07:25:22