我有一個輸入文件a.txt
:fprintf中保存錯誤的數據保存到文件
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;
}
請閱讀[爲什麼「while(!feof(file))」總是錯?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)。你不使用完全相同的結構,但你有同樣的問題。 –
你的'row'函數並不總是返回一個值。當'fscanf()'失敗時,你不會返回任何東西,所以你會得到隨機的亂碼。您的代碼不會保護自己的行數超過其存儲的行數。這會導致問題。一定要確保你不會訪問超出數組範圍的內存。 –