2017-05-14 61 views
-1

我目前正在C語言中練習文件I/O。我創建了一個程序,我從中獲取文件並從中提取數據,我想要一個選項來更改文件正在閱讀。我遇到的問題是,例如我有兩個文件:sample1.txtsample2.txt。如果我選擇sample1.txt作爲第一個要讀取的文件,然後我想將文件更改爲sample2.txt,最終發生的情況是文件名不會更改爲sample2.txt,而是始終保留第一個文件具有的文件名。使用fopen將當前文件名更改爲另一個文件

這裏是我的代碼:爲什麼我的代碼一直沒有給我

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <strings.h> 
#include <assert.h> 
#include <time.h> 
#include <ctype.h> 
int main() 
{ 
char file_location[100]={0}; 
char new_location[100]={0}; 
    FILE* fPointer=NULL; 
    int choice; 

    printf("Enter the filename that you wish to open.\n"); 
    scanf("%[^\n]s",file_location);    // I enter sample1.txt// 
    printf("%s\n",file_location); 
    fPointer=fopen(file_location,"r"); // success,sample1.txt is currently being read.// 

if (fPointer==NULL) 
     { 
      printf("File error!,invalid file name! program will now exit.\n"); 
      exit(0); 
     } 
else 
     { 
      printf("Success!\n");  
     } 
    printf("Do you want to change the file being read\n); //Now I want to change the file,from sample1.txt to sample2.txt// 
    prinft("Enter 1 to change, 0 to exit the program\n); 
    do{ 
     scanf("%d",&choice);      
     printf("You entered %d\n",choice); 
     if(choice<0||choice>1) 
     { 
     printf("Error,please choose between 1 and 0\n"); 
     } 

    }while(choice!=1||choice!=0); 
     switch(choice)     // I enter 1,go to case1// 
    { 
     case 0: 
     printf("Exiting program now\n"); 
     exit(0); 
     break; 
     case 1: 
     fclose(fPointer); 
     printf("Enter the filename that you wish to open.\n");  
     scanf("%[^\n]s",new_location);   //scanf does not even prompt me to enter a string.// 
     printf("%s\n",new_location);  //nothing prints// 
     fPointer=fopen(new_location,"r"); // fpointer still points to sample1.txt// 
     break; 
    } 

return 0;   
} 

誰能解釋一下嗎? 任何建設性的批評,關於文件I/O的筆記表示讚賞。

+0

你缺少了'1'情況下,默認一個 –

+0

@JoaoTorres謝謝後'break' statment,編輯的代碼。 – Noobplox23

+2

@ Noobplox23 **縮進**你的代碼! – gsamaras

回答

2

根本問題是您的代碼不正確地處理換行符。獲得輸入的這種方法可能不會做你認爲它的作用:

scanf("%[^\n]s",new_location); 

首先,沒有理由拖尾s這裏。其次,這會在輸入流中留下尾隨的換行符。由於%d轉換說明符會跳過前導空格字符,因此在您撥打scanf("%d",&choice);時將忽略此換行符。但是,對scanf()的第二次調用也會留下換行符,並且在scanf()的最後調用中這不會被忽略,因爲%[^\n]會通知scanf()讀取字符,直到遇到換行符爲止。

一個解決方法是簡單地從你的scanf()語句刪除掃描集:

scanf("%s", new_location); 

這將忽略前導空格字符,所以換行留下從上一次調用scanf()將被忽略。

另外,當您打開新文件時,您使用的是file_location而不是new_location

你需要改變你的do循環條件:只有當用戶輸入一個數字,既

while(choice != 1 && choice != 0); 

因爲要重複循環不爲0而不是1

如果您想要讀取包含空格的行,這是[^\n]有時用於的行,更好的替代方法是使用fgets()。這個函數保留換行符,所以你需要將它從文件名中移除。另外,如果您使用fgets()來獲取字符串,最好使用fgets()來獲取數字輸入,方法是將用戶輸入讀入緩衝區,並使用sscanf()來解析它。然後你輸入的代碼看起來像:

/* Get first filename, and remove the newline */ 
printf("Enter the filename that you wish to open.\n"); 
fgets(file_location, sizeof file_location, stdin); 
file_location[strcspn(file_location, "\r\n")] = '\0'; // remove newline 

... 

/* Get numeric input; this keeps the newline, so it does not interfere 
* with the next call to `fgets()` */ 
char buffer[100]; 
fgets(buffer, sizeof buffer, stdin); 
sscanf(buffer, "%d", &choice); 

... 

/* Get the new filename, and remove the newline */ 
printf("Enter the filename that you wish to open.\n"); 
fgets(new_location, sizeof new_location, stdin); 
new_location[strcspn(new_location, "\r\n")] = '\0'; // remove newline 
+0

謝謝!我會嘗試你的建議! – Noobplox23

+0

您的建議奏效!謝謝!我剛剛開始學習C這個學期,File I/O是最後一個話題,所以我想在我的決賽之前練習File I/O。 – Noobplox23

+0

@ Noobplox23--我爲這個添加了一些關於使用'fgets()'的註釋,這是一個更好的解決方案。這允許輸入包含空格的字符串,這是'[^ \ n]'說明符通常使用的,但更易於使用且更靈活。如果你想閱讀關於從字符串中刪除尾隨的換行符,[這是一個很好的鏈接](http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input)。 –

相關問題