2016-03-06 75 views
0

我有一個輸入文件a.txtfprintf中保存錯誤的數據保存到文件

1 abc 3 
2 efgh 4.5 
3 text 3 
4 xyz 2 

因此,基本上,它有3列,第一個數據類型爲int,第二個是text,第三是雙。我需要按行讀取這個文件(我猜測這實際上是有效的),但是在將第二列和第三列寫入另一個文件(b.txt)時會出現一些問題。 fprinft節省了這樣的事情:的

0.000000 
0.000000 
0.000000 
0.000000 
xvæ$ 0.000000 

代替

abc 3 
efgh 4.5 
text 3 
xyz 2 

我只需要僅從a.txt文件保存在第二和第三列b.txt文件。這裏是我的代碼:

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

typedef struct mypair 
{ 
    char string[1024]; 
    double number; 
} mypair; 

void zero_string(char *string, int n) 
{ 
    int i; 
    for(i=0; i<n; i++) 
     string[i] = '\0'; 
} 

int row(FILE* f, struct mypair *p) 
{ 
    int num; 

    if(!feof(f)) 
    { 
     if(fscanf(f,"%d %s %lf", &num, p->string, &p->number) == 3) 
     { 
      return 0; 
     } 
    } 
    else 
    { 
     return 1; 
    } 
} 

int main(int argc, char **argv) 
{ 
    int n = 5, status = 0, i = 0, j; 

    struct mypair array[5]; 
    char file_in_name[255]; 
    char file_out_name[255]; 

    FILE *fin; 
    FILE *fout; 

    zero_string(file_in_name, 255); 
    zero_string(file_out_name, 255); 

    printf("Data file:\n> "); 
    scanf("%s", file_in_name); 
    printf("Out file:\n> "); 
    scanf("%s", file_out_name); 

    fin = fopen(file_in_name, "r"); 
    fout = fopen(file_out_name, "w"); 

    if(fin == NULL) 
    { 
     exit(-1); 
    } 
    if(fout == NULL) 
    { 
     exit(-1); 
    } 

    while(status != 1) 
    { 
     status = row(fin, &array[i]); 
     i ++; 

     fprintf(fout, "%s %lf\n", array[i].string, array[i].number); 

     if(i >= n) 
      break; 
    } 

    fclose(fin); 
    fclose(fout); 

    for(j=0; j<i; j++) 
     printf("%s %lf\n", array[i].string, array[i].number); 

    return 0; 
} 

我修改了代碼,現在它的工作,謝謝!

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

typedef struct mypair 
{ 
    char string[1024]; 
    double number; 
} mypair; 

void zero_string(char *string, int n) 
{ 
    int i; 
    for(i=0; i<n; i++) 
     string[i] = '\0'; 
} 

int row(FILE* f, struct mypair *p) 
{ 
    int num; 

    if(!feof(f)) 
    { 
     if(fscanf(f,"%d %s %lf", &num, p->string, &p->number) == 3) 
     { 
      return 0; 
     } 
    } 
    else 
    { 
     return 1; 
    } 
} 

int main(int argc, char **argv) 
{ 
    int n = 5, status = 0, i = 0, j; 

    struct mypair array[5]; 
    char file_in_name[255]; 
    char file_out_name[255]; 

    FILE *fin; 
    FILE *fout; 

    zero_string(file_in_name, 255); 
    zero_string(file_out_name, 255); 

    printf("Data file:\n> "); 
    scanf("%s", file_in_name); 
    printf("Out file:\n> "); 
    scanf("%s", file_out_name); 

    fin = fopen(file_in_name, "r"); 
    fout = fopen(file_out_name, "w"); 

    if(fin == NULL) 
    { 
     exit(-1); 
    } 
    if(fout == NULL) 
    { 
     exit(-1); 
    } 

    printf("\n"); 

    while(status != 1) 
    { 
     status = row(fin, &array[i]); 

     if(i >= n) 
      break; 
     else 
     { 
      if(status != -1) 
       fprintf(fout, "%s %lf\n", array[i].string, array[i].number); 
     } 

     i ++; 
    } 

    fclose(fin); 
    fclose(fout); 

    for(j=0; j<i; j++) 
     printf("%s %lf\n", array[j].string, array[j].number); 

    return 0; 
} 
+3

請閱讀[爲什麼「while(!feof(file))」總是錯?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)。你不使用完全相同的結構,但你有同樣的問題。 –

+1

你的'row'函數並不總是返回一個值。當'fscanf()'失敗時,你不會返回任何東西,所以你會得到隨機的亂碼。您的代碼不會保護自己的行數超過其存儲的行數。這會導致問題。一定要確保你不會訪問超出數組範圍的內存。 –

回答

3

在你的底部循環中,你想通過j索引你的數組,而不是i。

+0

謝謝!我不知道我有沒有注意到它的可能性! –

+0

但是,out文件仍然是錯誤的 –