我的文件包含三行,在使用fgets将文件读入数组后,我想打破新行字符的三行并在控制台上单独打印三行,如果可能的话,将三行放入三个不同的阵列。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE *infile;
char data[BUFSIZ],*pa,token_seperator[]={"\n"};
infile=fopen("example","r");
while((fgets(data,BUFSIZ,infile)!=NULL))
pa=strtok(data,token_seperator);
while(pa!=NULL)
{
printf("%s\n",pa);
pa=strtok(NULL,token_seperator);
}
}
答案 0 :(得分:1)
没有任何意义“打破新行字符的三行”,因为一行只能包含一行新行。
如果需要读取单独数组中的每一行,则只需声明一个二维字符数组。如果需要,可以通过调用fgets
删除附加到每一行的换行符。
所以该程序可以采用以下方式。
#include <stdio.h>
#include <string.h>
#define N 3
int main( void )
{
FILE *infile;
char data[N][BUFSIZ];
infile = fopen( "example", "r" );
if ( infile )
{
size_t n = 0;
for (; n < N && fgets(data[n], BUFSIZ, infile); n++)
{
data[n][strcspn(data[n], "\n")] = '\0';
}
for (size_t i = 0; i < n; i++)
{
printf("%s\n", data[i]);
}
}
return 0;
}
答案 1 :(得分:0)
你需要分配一些内存才能做到这一点,只是因为你不知道你最终会有多少行,也不知道每行的大小。
我建议您使用下一个代码
DispatcherTimer _timer;
bool cancelled;
async void Click()
{
if (_timer != null)
{
_timer.Stop();
_timer.Dispose();
}
ErrorPanel.Visibility = Visibility.Visible;
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromSeconds(10);
_timer.Tick += _timer_Tick;
_timer.Start();
var products = await Task.Run(() => Communication.GetProductList(tempPznList));
_timer.Stop();
if (!cancelled)
{
mainPznItem.SubPzns = products;
ErrorPanel.Visibility = Visibility.Hidden;
}
}
private void _timer_Tick(object sender, EventArgs e)
{
MessageBox.Show("error...");
_timer.Tick -= _timer_Tick;
_timer.Stop();
cancelled = true;
ErrorPanel.Visibility = Visibility.Hidden;
}
答案 2 :(得分:0)
下面的函数truncCrLf
从ASCII-0字符串中删除CR和/或LF代码的第一次出现。这就是您要查找的内容,因为fgets
函数从文件中读取这些ASCII代码(0xA和/或0xD)。
此功能在Linux和Windows SO下运行。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * truncCrLf(char *data)
{
char *app=NULL;
app = strchr(data, '\n');
if (app)
*app=0;
app = strchr(data, '\r');
if (app)
*app=0;
return data;
}
int main(void)
{
char test[200];
strcpy(test,"Hello world\n");
printf("%s......\n",test);
truncCrLf(test);
printf("%s......\n",test);
return 0;
}