[英]After using fscanf to get to a specific line, how to read that entire line?
[英]How to read a multi line using fscanf
我想讀取看起來像的data.txt文件並將其存儲在名為buffer [i] [j]的數組中
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
我正在寫一個看起來像的代碼
#include"stdio.h"
#include"stdlib.h"
int main() {
FILE *fp1;
int i,j;
int buffer[4][4]={0};
fp1 = fopen("exact_enumerated_config_442_cub_mc","r");
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
fscanf(fp1,"%d", &buffer[i][j]);
}
// fscanf(fp1,"\n");
}
fclose(fp1);
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
printf("%d ",buffer[i][j]);
}
printf("\n");
}
}
但是我得到了輸出...
1 1 2 1
5 1 6 1
17 1 18 1
21 1 22 1
為什么????
fopen()
的結果以確保文件已打開。 fscanf()
的結果以確保其成功,並防止可能未分配值的后續代碼處理變量(它返回已分配的數量)。 " %d"
。 該代碼將對具有16個int
的單行與與具有4個int
的四行相同。 如果重要的是文件的格式為每行四個int
,則使用fgets()
讀取一行,然后使用sscanf()
使用%n
格式說明符提取int
,以確保已處理完整緩沖區:
int ints[4][4] = { { 0 } };
char buffer[1024];
for (int i = 0; i < 4 && fgets(buffer, 1024, fp); i++)
{
int pos;
if (sscanf(buffer,
"%d %d %d %d%n",
&ints[i][0],
&ints[i][1],
&ints[i][2],
&ints[i][3],
&pos) != 4 || pos != strlen(buffer) - 1)
{
fprintf(stderr, "Invalid format: <%s>\n", buffer);
exit(1);
}
}
要獲取所需的輸出(1111,2222,...),請更改:
fp1 = fopen("exact_enumerated_config_442_cub_mc","r");
至:
fp1 = fopen("data.txt","r");
說明:使用fopen
,應輸入要讀取的文件名。 在這種情況下,您必須寫入data.txt
,而不是exact_enumerated_config_442_cub_mc
...沒有使用該名稱的文件,而且沒有像1 1 1 1、2 2 2 2、3 3 3 3、4 4 4 4這樣的數據。 ...
有關更多詳細信息,請訪問:
wikibooks.org/wiki/C_Programming/C_Reference/stdio.h/fopen
這是為您提供所需輸出的“已修改”(已刪除多余/浪費/多余{
}
並寫入了data.txt
)代碼:1 1 1 1,2 2 2 2,3 3 3 3,4 4 4 4.它打印名為buffer
的數組。 這意味着...
... 數據已成功復制! 從 "data.txt"
到 buffer[4][4]
:
#include"stdio.h"
#include"stdlib.h"
int main()
{
FILE *fp1;
int i,j;
int buffer[4][4];
for ( i = 0; i < 4; i++ )
for ( j = 0; j < 4; j++ )
buffer[i][j] = 0;
fp1 = fopen("data.txt","r");
for(i=0; i<4; i++)
for(j=0; j<4; j++)
fscanf(fp1,"%d", &buffer[i][j]);
fclose(fp1);
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
printf("%d ",buffer[i][j]);
printf("\n");
}
return 0;
}
PS
如果data.txt
將不包含
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
但
1 1 1 1
2 2 2 2
3 3 3 3
4 444 // the last two elements are absent
程序將正確讀取第一行,第二行和第三行,並且第四行的輸出為
4 444 0 0
它先輸出4
,然后輸出444
,然后輸出0
和0
:最后兩個元素為'0',因為buffer
已由零初始化,因此所有元素均更改了其值,但最后兩個元素仍為零。
在字符串格式的開頭添加空格,應為" %d"
以避免換行問題
fscanf(fp1," %d", &buffer[i][j]);
順便說一句,您可以改用以下代碼
for(i=0;i<4;i++) {
fscanf(fp1," %d %d %d %d", &buffer[i][0], &buffer[i][1], &buffer[i][2], &buffer[i][3]);
}
您已經說過要讀取data.txt
然后為什么要打開文件exact_enumerated_config_442_cub_mc
嘗試改變這個
fp1 = fopen("exact_enumerated_config_442_cub_mc","r");
至
fp1 = fopen("data.txt","r");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.