2016-02-01 168 views
0

我開始學習C,我應該讀取一個我有的txt文件,並試圖從命令行打開它。我應該從txt文件中獲取數據並對其進行解碼,但現在我只是試圖將其寫入新文件,並且似乎無法讓我的輸入文件讀入並隨後寫入新的txt文件我想創建的文件。我試過用while循環打印出文件的內容,但無濟於事。 任何幫助,將不勝感激。如何從命令行讀取文件

編輯: 我的程序目前不會通過我的while循環打印任何東西,並給我一個「分段錯誤」錯誤,並且不寫入我的新txt文件,雖然它創建它,但文件中沒有任何內容。 該文件的內容很長,但遵循以下模式:

encodedLength,bits,base64 

12,64,AAAAAAAAAEA= 
12,64,vvj7ZlmphkA= 
12,64,k+Oj/7LbkUA= 
56024,64,qZzGabZBf0CQT8vJMEJ/QISgOVMaRH9AwB2+bG9Lf0BpLEli0FF/QKEpqrloU39A9klOPONTf0CETlNyiV9/QKUKUN66Yn9A7CEjAnlsf0ATW5MDlnF/QG1IilrIdH9AhU5hRvF0f0DHblZlf3t/QLHq2kXRe39AF951+tqCf0C7/5Gv+YN/QD6plms3in9AWwvIRy2Lf0BY5BOuJJR/QDOqDBoxm39AnD3CrKOxf0DOKmoimrJ/QGh1pV4Vs39AGRJSh2ezf0CZnRzF4rN/QJ2y6tkLtH9Aj2XT7jS0f0ButtYDXrR/QDql9BiHtH9A8TEtLrC0f0AqJe5YArV/QGJZu24SvH9ArdxKi3XDf0BTUi3Jx8N/QLmkMUZsxH9ARgiIpwLLf0DsSAGSWc9/QBxGuUw1039ALnyq8dnTf0APkUWYftR/QBnhLsKn1H9AQZAiU07ef0D2a2fCneN/QBSk4Cnw439ACS3FXRnkf0DqU8SRQuR/QLgY3sVr5H9AdHsS+pTkf0AcfGEuvuR/QJS+/yPN539AoG68zonqf0B/kCovZ+5/QKcy0WmQ7n9AvXKSpLnuf0C8UG7f4u5/QKzMZBoM739AiOZ1VTXvf0BSnqGQXu9/QAn058uH739AredIB7Hvf0BAeKEIbvJ/QJCG4UWX8n9AzTI8g8Dyf0D3fLHA6fJ/QAtlQf4S839AD+vrOzzzf0ABD7F5ZfN/QN/QkLeO839AqzCL9bfzf0BkLqAz4fN/QArKz3EK9H9AnQMasDP0f0Aa237uXPR/QIdQ/iyG9H9A4WOYa6/0f0ApFU2q2PR/QF1kHOkB9X9Acsxj5ab1f0AtRjtpjfh/QMP3qG4y+X9A+u5GsFv5f0AdhP/xhPl/QC630jOu+X9ALIjAddf5f0AU98i3APp/QOwD7Pkp+n9Axo7rGoT+f0BB0h6l1v5/QHGNvC8p/39A7FczdVL 

我的代碼:

int main(int argc, char* argv[]) 
    { 
     char fileString[256]; 
     char line[256]; 

     /*Pseudocode 
     Need to convert base 64 string back into 32 bit floats 

     Algorithm: 
     Open up file in command line 
     Skip first line of txt file 
     Read file in line by line 
     Convert each line from base64 to 32 bit floats (truncated to 3 decimal places), end each with a new line 
     Store all of this in an output file called p1_output.txt 

     */ 

     printf("Please enter your file name (include file extension): "); 
     scanf("%s", &fileString); 
     printf("%s\n", fileString); 

     FILE *inputFile = fopen(fileString, "r"); 
     FILE *outputFile = fopen("p1_output.txt", "w+"); 

     while(fgets(line, 256, inputFile)) 
     { 
      printf("%s", line); 
      fputs(line, outputFile); 

     } 

     return 0; 
    } 
+0

程序的當前行爲究竟是什麼?它會崩潰嗎?它打印垃圾嗎?它什麼都不打印?它是否將任何內容寫入輸出文件?什麼?請具體提供輸入文件內容。 – kaylum

+0

我已經添加了該信息的編輯。 – Jason

+0

在這種情況下,請檢查每個「fopen」調用的返回值以確保它們沒有失敗(實際上,應該始終檢查返回值的錯誤)。 – kaylum

回答

1

首先,
標題到您的文章問如何在命令行中讀取文件
下面是一個簡單的例子:

int main(int argc, char *argv[]) 
{ 
    if(argc != 2) 
    { 
     printf("usage: %s filename", argv[0]); 
     return 0; //should be two arguments, exe name & file path/name 
    } 
    //if Windows: 
    if(GetFileAttributes(argv[1]) != 0xffffffff) //file exists 
    { 
     //do something with file; 
     FILE *file = fopen(argv[1], "r"); 
     // and so on... 
    } 
    //if Linux: 
    if (0 == access(path, 0))//file exists 
    { 
     //do something with file; 
     FILE *file = fopen(argv[1], "r"); 
     // and so on... 

    } 

    return 0; 
} 

接下來,
您提供輸入文件的文本至少1060個字節長,最長的線是976個字節。您創建的行緩衝區(char line[256];)不夠大。如果可以通過編程方式預先確定正在閱讀的內容,則可以在嘗試寫入緩衝區之前在運行時調整緩衝區的大小。以下面的示例代碼查看可以在運行時完成的方式(讀取未知內容的文本文件)。

接着,變化:

scanf("%s", &fileString); 
      ^

到:

scanf("%s", fileString);//do not need the & for reading in strings 
      ^

接下來,檢查每個呼叫的輸出以fopen()

實施例:

FILE *outputFile = fopen("p1_output.txt", "w+"); 
if(!outputFile) return -1; 
//else continue using outputFile 

讀取未知內容的文本文件。在嘗試將文件讀入緩衝區之前,有時測試文件的內容是有幫助的。例如,此示例函數將顯示文本文件中的行數和最長的行:(將它傳遞給輸入文件的path_name,它將返回文件中最長的行,並用linecount更新int *lc

int longestline(const char *filename, int *lc) 
{ 
    FILE *fp; 
    int cnt=0, cntKeep=0; 
    int c; 
    fp = fopen(filename, "r"); 
    if(!fp) 
    { 
     *lc = 0; 
     return 0; 
    } 
    (*lc) = 0; 
    while ((c = fgetc (fp)) != EOF) 
    { 
     if(c != '\n') 
     { 
      cnt++; 
     } 
     else 
     { 
      cnt = 0; 
      (*lc)++; //update line counter 
     } 
     cntKeep = cntKeep < cnt ? cnt : cntKeep;//update longest line counter 
    } 
    if(cnt > 0) (*lc)++;//last line may not have '\n' 
    fclose(fp); 
    return cntKeep; 
} 

使用上述功能,它可以讀取您的文件,並將內容放入輸出文件中。

int main(void) 
{ 
    FILE *in; 
    FILE *out; 
    int linecount; 

    int longest = longestline("C:\\dev\\play\\file2.txt", &linecount); 

    char string[longest+2];//create buffer with known longest line with room for white space and NULL 

    in = fopen("C:\\dev\\play\\file2.txt", "r"); 
    if(!in) return 0; 
    out = fopen("C:\\dev\\play\\output.txt", "w"); 
    if(!out) return 0; 

    while(fgets(string, longest+2, in)) 
    { 
     fputs(string, out); 
    } 
    fclose(in); 
    fclose(out); 


} 
+0

因此,在包含if語句之後,我的程序正確輸出了我的輸出文件的內容。爲什麼這個修復它?對不起,我只是沒有看到爲什麼添加該語句會修復它。 – Jason

+0

我不確定。這本身只應該告訴你,如果你的'fopen'不起作用,並允許你優雅地退出。你是否修改了兩個對'fopen()'的調用? – ryyker

+0

@Chux - 你是對的,我錯了。我將編輯。 (OP中提供的輸入文件有4行,其中一行是976字節,創建的行緩衝區太小,無法正確讀取輸入文件。)謝謝。 – ryyker